我有这样的事情:
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
。其他值发生了什么?我知道它们存在于那些循环中,因为我回声以确保变量包含某些东西。
摘自Bash常见问题解答:
我在管道中的循环中设置变量。为什么它们在循环终止后消失了?
如上所述,这种可能令人惊讶的行为的原因是,每个SubShell都引入了新的变量上下文和环境。上面的while循环在一个新的子Shell中执行,它具有自己的变量linecount副本,该副本由从父Shell取得的初始值“ 0”创建。然后将此副本用于计数。while循环完成时,子shell副本将被丢弃,并且回显命令中将使用父级的原始变量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]")"
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句