unset array[0]
は要素を削除しますが、削除した場合でもecho ${array[0]}
さらにnull値を取得する方法は他にもありますが、配列の要素に以下のようなスペースが含まれている場合
array[0]='james young'
array[1]='mary'
array[2]='randy orton'
しかし、これらはまた仕事をしません
array=${array[@]:1} #removed the 1st element
今、私は新しい配列が
array[0]='mary'
array[1]='randy orton'
スペースは代入後に問題を引き起こし、実際の配列は置換のようになります。
array=(mary randy orton)
割り当てで配列構文を使用し、変数を引用します。
array=("${array[@]:1}") #removed the 1st element
編集コメント内の質問に従って。ために $@
次のように使用できます:
set -- "${@:2}" #removed the 1st parameter
これは私に考えさせられました。 sed/awk/tailの問題は、1行ずつ表示されることです。最初の行を削除した後、パターンスペースからファイルに1行おきに書き込む必要があります。
最初の行を削除してファイルに戻します。
readarray -t aLargeFile < <(cat largefile)
echo "${aLargeFile[@]:1}" >largefile
largefile
をファイルの名前に変更するだけです。
特定のインデックスの要素を削除するには、unset
を使用して、別の配列にコピーします。この場合、unset
だけは必要ありません。 unset
は要素を削除しないため、配列内の特定のインデックスにnull文字列を設定するだけです。
declare -a arr=('aa' 'bb' 'cc' 'dd' 'ee')
unset 'arr[1]'
declare -a arr2=()
i=0
for element in ${arr[@]}
do
arr2[$i]=$element
((++i))
done
echo ${arr[@]}
echo "1st val is ${arr[1]}, 2nd val is ${arr[2]}"
echo ${arr2[@]}
echo "1st val is ${arr2[1]}, 2nd val is ${arr2[2]}"
出力は
aa cc dd ee
1st val is , 2nd val is cc
aa cc dd ee
1st val is cc, 2nd val is dd
#!/bin/bash
q=( one two three four five )
echo -e "
(remove) { [:range:] } <- [:list:]
| [:range:] => return list with range removed range is in the form of [:digit:]-[:digit:]
"
function remove {
if [[ $1 =~ ([[:digit:]])(-([[:digit:]]))? ]]; then
from=${BASH_REMATCH[1]}
to=${BASH_REMATCH[3]}
else
echo bad range
fi;shift
array=( ${@} )
local start=${array[@]::${from}}
local rest
[ -n "$to" ] && rest=${array[@]:((${to}+1))} || rest=${array[@]:((${from}+1))}
echo ${start[@]} ${rest[@]}
}
q=( `remove 1 ${q[*]}` )
echo ${q[@]}
~
~