在各种循环中附加到同一个数组,只有最后一个值仍然是 Bash 4

Gre*_*hal 9 shell bash pipe variable

我有这样的事情:

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
Run Code Online (Sandbox Code Playgroud)

但数组最终只包含../out/amsterdam/apples/system.map../out/amsterdam/apples/vmlinux。其他值发生了什么变化?我知道它们存在于这些循环中,因为我回声以确保变量包含某些内容。

Ter*_*ior 15

取自Bash 常见问题解答

我在管道中的循环中设置变量。为什么它们在循环终止后消失?

如上所述,这种可能令人惊讶的行为的原因是每个 SubShell 都引入了一个新的变量上下文和环境。上面的 while 循环在一个新的子 shell 中执行,它自己的变量 linecount 的副本使用从父 shell 中获取的初始值“0”创建。该副本然后用于计数。当while循环结束时,子shell副本被丢弃,在echo命令中使用父级的原始变量linecount(其值没有改变)。

为了避免在第二个循环中创建子shell,您可以通过管道以外的方式向其提供数据:

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

.

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