在if语句中捕获bash退出代码



如果我直接用单个命令对退出代码进行简单测试:

[user@localhost ~]$ date
Tue Sep  8 14:00:11 CEST 2020
[user@localhost ~]$ echo $?
0
[user@localhost ~]$ dat
bash: dat: command not found...
[user@localhost ~]$ echo $?
127

但是,如果我想把它们放入if语句中,我会看到对于出口代码0,输出是可以的,然而,对于";命令未找到";代码(应该是127(,它返回";1〃;。

[user@localhost ~]$ date 
Tue Sep  8 14:02:18 CEST 2020
[user@localhost ~]$ if [ $? -eq 0 ]; then   echo "Success: $?"; else   echo "Failure: $?" >&2; fi
Success: 0
[user@localhost ~]$ dat
bash: dat: command not found...
[user@localhost ~]$ if [ $? -eq 0 ]; then   echo "Success: $?"; else   echo "Failure: $?" >&2; fi
Failure: 1

我错过了什么?

如果您想捕获并打印每个命令的退出代码,我不会麻烦将其保存在变量中。只有当您以后再次需要此退出代码,或者有一些非零退出代码您不认为是错误时,这才是必要的。

相反,我会这样做:

更换现有

command_to_verify

通过

if command_to_verify
then
echo Success
else
echo Failure: $?
fi

每个命令都有自己的退出状态,因此命令[1将覆盖$?。为了防止这种情况,请将退出代码保存到一个变量中,并在if语句中使用该变量;

le=$?
if [ "$le" -eq 0 ]; then   echo "Success: $le"; else   echo "Failure: $le" >&2; fi

在线试用!


1:单括号[实际上是测试命令的别名,它不是语法。有关更多信息,请查看unix.stackexchange 上的此评论

最新更新