配列にforループを使用すると、他の結果が表示されます。

配列にforループを使用すると、他の結果が表示されます。

Bashの配列にはいくつかの問題があります。

この配列が与えられると:

 krn=(linux-image-4.15.0-30-generic linux-image-4.15.0-32-generic linux-image-4.15.0-33-generic)

次のforループを使用して繰り返すと、何も変更せずに他の結果が得られます。

最初:

for krn in ${krn[@]};do echo $krn;done
linux-image-4.15.0-30-generic
linux-image-4.15.0-32-generic
linux-image-4.15.0-33-generic

第二:

for krn in ${krn[@]};do echo $krn;done
linux-image-4.15.0-33-generic
linux-image-4.15.0-32-generic
linux-image-4.15.0-33-generic

私は何が間違っていましたか?

Cスタイルの配列長を使用すると、奇妙に動作しません。

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

ベストアンサー1

ループがkrnループ変数として使用されます。これはループする配列の名前でもあります。シェルは、配列変数と非配列変数に対して別々の名前空間を保持しません。

繰り返しごとに、配列krnの現在値に設定されます。これは、各反復で配列の最初の要素を変更する効果があります。ループは、ループが終了した後に最初の要素が最後の要素のコピーになるように配列を変更します。

この問題を解決するには、ループ変数または配列に別の名前を選択します。


また、"${krn[@]}"ループヘッダーに(拡張、二重引用符)を使用する必要があります。${krn[@]}引用符なしで使用すると、各要素がスペース(または内のすべての項目$IFS)に分割され、結果の単語に対してファイル名のグロービングが呼び出されるためです。echo "${krn[i]}"以降のループでも同様です。

配列に複数の要素があると仮定すると、ループ全体を次のように置き換えることもできます。

printf '%s\n' "${krn[@]}"

おすすめ記事