Bash
在各種循環中附加到同一個數組,只剩下最後一個值 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
and../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]")"