知に至る病

お勉強したことを忘れないように書き留めています。

bash の配列を for ループで使う

bash で for ループを使って配列の要素を参照するやり方のメモです。

for-each

配列の全要素を列挙するには ${array[@]} または ${array[*]} を使います。 インデックスの情報が必要ないのであれば,これが一番シンプルなやり方ですね。

for v in "${array[@]}"
do
    echo "$v"
done

インデックスの情報が必要な場合は,変数を用意して自前でカウントしなくてはなりません。

i=0
for v in "${array[@]}"
do
    echo "$i => $v"
    let i++
done

@ と * の違い

@* の違いは,ダブルクォーテーションで括ったときに,前者が配列の各要素を個別に出力するのに対して,後者は全要素を 1 つに結合した結果を出力する点です。 配列を使って join 相当の処理をしたいといった特別な理由がない限り,添え字に @ を使ってダブルクォーテーションで括っておけば間違いがありません。

素数を使って C 言語風に

配列の要素数${#array[@]} または ${#array[*]} で取得できます。 これを使って C 言語風の for ループを以下のように書けます。

for ((i = 0; i < ${#array[@]}; i++))
do
    echo "$i => ${array[$i]}"
done

添え字のリストでよりスマートに

${!array[@]}${!array[*]} とすると,配列 array の添え字のリストに展開されます。 C 言語風の for ループよりもスマートに書けます。 インデックスの情報が必要なら,この書き方が一番よいのではないでしょうか。

for i in "${!array[@]}"
do
    echo "$i => ${array[$i]}"
done

参考