如何在Bash中基于命令退出码编写if条件判断语句?
Bash中基于命令退出码的条件判断实现
嘿,我来帮你搞定这个问题!你现在的代码里用[ ./success.sh ]的方式其实不是在判断脚本的执行结果,而是在检查这个文件是否存在且非空——只要脚本文件存在,这个条件就会返回true,所以不管脚本执行成功还是失败,都会走if分支,这就是为什么你的预期输出没达到。
要实现基于命令退出码的判断,其实Bash的if语句本身就支持直接把命令作为条件:当命令执行的退出码为0(成功)时,进入if分支;非0(失败)时进入else分支,这正好符合你的需求。
修改后的正确代码
#!/bin/bash # 直接执行脚本作为if条件 if ./success.sh; then echo "First: success!" else echo "First: failure!" fi if ./failure.sh; then echo "Second: success!" else echo "Second: failure!" fi
为什么这样有效?
Bash的if语法规则是:if <命令>; then ...,它会执行<命令>,然后根据命令的退出状态码来决定分支:
- 退出码
0:代表命令执行成功,进入if块 - 非
0:代表命令执行失败,进入else块
你的success.sh返回exit 0,所以第一个if会输出First: success!;failure.sh返回exit 1,第二个if会进入else分支,输出Second: failure!,完美匹配你的预期。
另一种方式:用$?获取退出码
如果你需要显式判断具体的退出码数值(比如区分不同的错误码),可以用$?变量获取上一个命令的退出码,再用test命令(也就是[ ])判断:
#!/bin/bash ./success.sh # 判断上一个命令的退出码是否为0 if [ $? -eq 0 ]; then echo "First: success!" else echo "First: failure!" fi ./failure.sh # 判断上一个命令的退出码是否为1 if [ $? -eq 1 ]; then echo "Second: failure!" else echo "Second: success!" fi
不过第一种直接把命令作为if条件的写法更简洁,也是Bash脚本中推荐的常规写法。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

