Linuxのシェルで配列のすべての要素にアクセスする記述は、「${VALS[@]}」と「${VALS[*]}」の2種類用意されています。この違いについてです。 「${VALS[@]}」と「${VALS[*]}」は、多くの場合で挙動は変わりません。しかし、値に空白が含まれる場合に挙動が変わります。
このような配列を考えます。
VALS[0]=123 VALS[1]=789 VALS[2]="abc def" VALS[3]=xyz 配列の長さは4です。
$ echo ${#VALS[@]} 4 $ echo ${#VALS[*]} 4 ループさせようとした場合
for var in ${VALS[@]}; do echo ${var} done for var in ${VALS[*]}; do echo ${var} done どちらの記述でもループは5回まわります…。
123 789 abc def xyz これは意図と異なるでしょう。
4回まわすようにするには以下のように書きます。
for var in "${VALS[@]}"; do echo ${var} done 123 789 abc def xyz 以下の記述ではどうなるのかというと…
for var in "${VALS[*]}"; do echo ${var} done 123 789 abc def xyz 全体を一つの文字列として解釈してしまいます。
値に空白を含む要素を持つ配列の繰り返し処理では、「"${VALS[@]}"」と書きましょう、というお話でした。
|
Linux >