Linux Shell脚本中&&||替代if-else时变量赋值无输出问题
Shell中&&/||组合的子shell变量作用域问题
你遇到的核心问题是子shell的变量作用域限制,下面分别解释两个脚本的差异:
第一个脚本的输出逻辑
当无$1参数时,[ "$1" ]判断失败,触发||后的命令:(echo 111; echo 222)。
这里的()会启动一个子shell执行内部命令,但echo是直接向标准输出打印内容,不管是子shell还是父shell,输出都会直接显示到终端,所以你能看到111和222。
第二个脚本的变量为空原因
同样无参数时触发||后的(var1=111; var2=222),但这里是在子shell中定义变量。子shell是独立的执行环境,它的变量仅在自身生命周期内有效,子shell执行完毕退出后,这些变量不会传递给父shell(也就是主脚本的执行环境)。
所以主脚本后续的echo "$var1"和echo "$var2"访问的是父shell的变量,而父shell中从未定义过这两个变量,因此输出为空。
解决方法:避免子shell赋值
如果要在这种逻辑下给主脚本的变量赋值,不要用(),改用{}(大括号)执行命令——大括号不会启动子shell,而是在当前shell环境中执行:
#!/bin/sh [ "$1" ] && echo "000" || { var1=111; var2=222; } echo "$var1" echo "$var2"
无参数运行这个脚本,就能正常输出111和222了。
内容的提问来源于stack exchange,提问作者Gektor
相关产品推荐
相关产品推荐

