我有这样的事情:
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]")"