在各种循环中附加到同一数组,仅保留最后一个值 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

取自bash 常见问题解答:

我在管道中的循环中设置变量。为什么循环结束后它们就消失了?

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

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

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

相关内容