さまざまなループで同じ配列に追加し、最後の値のみを保持するBash 4

さまざまなループで同じ配列に追加し、最後の値のみを保持するBash 4

私は次のようなものがあります:

FILES=()
for i in *.map
do
    FILES+=($i)
done

find /var/candy -name "chocolate_[0-9]" | while read snack
do
    FILES+=($snack)
done

for file in ../out/amsterdam/apples/{system.map,vmlinux}
do
    FILES+=($file)
done

ただし、配列には../out/amsterdam/apples/system.map合計のみが含まれます../out/amsterdam/apples/vmlinux。他の値はどうなりますか?変数に何かが含まれていることを確認するためにエコーするので、これらのループに存在することを知っています。

ベストアンサー1

からインポートバッシュFAQ:

パイプライン内のループに変数を設定しました。ループが終わるとなぜ消えますか?

上記のように潜在的に驚くべき動作が発生する理由は、各SubShellが新しい変数コンテキストと環境を導入するためです。上記のwhileループは、親シェルから取得した初期値 "0"で生成されたlinecount変数の独自のコピーを持つ新しいサブシェルで実行されます。このコピーは計算に使用されます。 whileループが完了すると、サブシェルのコピーが削除され、親シェルの元の変数linecount(その値は変更されません)がechoコマンドに使用されます。

2番目のループでサブシェルが生成されるのを防ぐために、パイプ以外のものを介してデータを供給できます。

while read snack; do
    FILES+=($snack)
done < <(find /var/candy -name "chocolate_[0-9]")

while read snack; do
    FILES+=($snack)
done <<<"$(find /var/candy -name "chocolate_[0-9]")"

おすすめ記事