为何Bash脚本中循环内read创建的var在循环后为空?
为什么循环结束后$var的值为空?
先看你的脚本和执行输出:
脚本内容
seq 10 | while read -r var do echo "read: $var" if [[ $var == 5 ]]; then echo "break loop: $var" break fi done echo "after loop: $var"
执行输出
read: 1 read: 2 read: 3 read: 4 read: 5 break loop: 5 after loop:
核心原因
问题出在管道(|)会创建子shell:
- 当你用
seq 10 | while ...的写法时,while循环是在管道生成的子shell中运行的,子shell拥有独立的变量环境。 - 循环里的
var是子shell的本地变量,和脚本主进程(父shell)的var完全是两个独立的变量。 - 当子shell因
break或循环结束退出后,它的所有变量会被销毁,父shell根本无法获取子shell里的var值,所以最后输出时$var为空。
解决办法
如果想让循环外也能拿到var的值,可以改用进程替换,让while循环在当前shell中执行:
while read -r var do echo "read: $var" if [[ $var == 5 ]]; then echo "break loop: $var" break fi done < <(seq 10) echo "after loop: $var"
执行修改后的脚本,最后会输出after loop: 5,符合预期。
内容的提问来源于stack exchange,提问作者PeopleMoutainPeopleSea
相关产品推荐
相关产品推荐

