Bash

在各種循環中附加到同一個數組,只剩下最後一個值 Bash 4

  • November 8, 2013

我有這樣的事情:

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.mapand ../out/amsterdam/apples/vmlinux。其他值怎麼了?我知道它們存在於那些循環中,因為我回應以確保變數包含某些內容。

取自Bash 常見問題解答

我在管道中的循環中設置變數。為什麼循環終止後它們會消失?

如上所述,這種可能令人驚訝的行為的原因是每個 SubShell 都引入了一個新的變數上下文和環境。上面的 while 循環在一個新的子 shell 中執行,該子 shell 使用從父 shell 獲取的初始值“0”創建的變數 linecount 的自己的副本。該副本然後用於計數。當 while 循環結束時,子 shell 副本被丟棄,並且在 echo 命令中使用 parent 的原始變數 linecount(其值沒有改變)。

為避免在第二個循環中創建子外殼,您可以通過管道以外的方式向其提供數據:

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]")"

引用自:https://unix.stackexchange.com/questions/99423