Sh、Bash中-o与||的适用场景有何区别?-o仅能在sh中使用吗?
-o 运算符的适用场景及Shell兼容性说明 -o和||是完全不同场景下使用的逻辑或运算符,你遇到的运行异常本质是把-o用在了不支持的语法场景中:
||是Shell原生的管道控制类逻辑运算符,可直接连接两个独立的命令,规则是前一条命令执行失败(退出状态码非0)时,才会执行后一条命令,所有POSIX兼容的Shell(包括sh、Bash、zsh等)都支持该语法。-o是test命令(也就是[ ]条件测试)内置的逻辑或运算符,仅能在条件测试语句内部使用,不能直接用来拼接两条独立的命令。
-o的适宜使用场景
-o的唯一适用场景就是在POSIX标准的[ ]条件测试内部,拼接多个判断条件,示例如下:
# 判断变量a等于1 或者 变量b等于2,符合POSIX规范,sh和Bash中都可运行 if [ "$a" -eq 1 -o "$b" -eq 2 ]; then echo "条件成立" fi
小提示:如果是Bash专属的脚本,更推荐在增强条件测试
[[ ]]中用||替代-o,写法更清晰,也能避免-o带来的优先级歧义、变量单词拆分等潜在问题,写法为[[ $a -eq 1 || $b -eq 2 ]]。
兼容性说明
-o并非仅支持在sh环境使用,所有遵循POSIX规范的Shell(包括Bash、dash、ksh等)都支持-o运算符,只是必须在[ ]条件测试内部使用,脱离该场景使用就会出现语法错误。
内容的提问来源于stack exchange,提问作者Richa Savant
相关产品推荐
相关产品推荐

