bashループの@と*

bashループの@と*

次の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

おすすめ記事