次の2つのループが同じ出力を生成することがわかりました。この特別なケース@
との違いが何であるかを理解するのに役立ちますか?*
#!/bin/bash
ips=(8.8.8.8 8.8.4.4)
for ip in ${ips[@]}; do
echo $ip
done
for ip in ${ips[*]}; do
echo $ip
done
すべて同じ結果を生成します。
8.8.8.8
8.8.4.4
ベストアンサー1
Bashのマニュアルページの引用
$ {name [subscript]}を使用して、配列内のすべての要素を参照できます。パス名拡張との競合を防ぐには、中かっこが必要です。下付き文字が@または*の場合、単語はnameのすべてのメンバーに展開されます。これらの下付き文字は、単語が二重引用符で囲まれている場合にのみ異なります。。
単語が二重引用符で囲まれている場合、${name[*]} は IFS 特殊変数の最初の文字で区切られた各配列メンバーの値を使用して単一の単語に展開されますが、${name[@]} は各単語を拡張します。配列要素名は単一の単語です。
配列メンバーがない場合、$ {name [@]}は空の状態に展開されます。単語内で二重引用符拡張が発生すると、最初の引数の拡張は元の単語の先頭に関連付けられ、最後の引数の拡張は元の単語の最後の部分に関連付けられます。
意味は次のとおりです
munai@munai-devops:~$ declare -a array
munai@munai-devops:~$ array=(1 2 3)
munai@munai-devops:~$ bakIFS=$IFS
munai@munai-devops:~$ IFS=","
munai@munai-devops:~$ echo "${array[*]}"
1,2,3
munai@munai-devops:~$ echo "${array[@]}"
1 2 3