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[@]}"