Linux‎ > ‎

「${VALS[@]}」と「${VALS[*]}」の違い

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[@]}"」と書きましょう、というお話でした。