Bash Shell命令是否成功运行

Bash Shell命令是否成功运行,你需要知道命令是否成功运行。

解决方案

如果编写命令或 shell 脚本的程序员遵循既定约定,那么 shell 变量 $? 会在命令失败时被设置为非 0 值。

$ somecommand
# it works...
$ echo $?
0
$ badcommand
# it fails...
$ echo $?
1
$

讨论

shell 变量 $? 中保存着命令的退出状态,其取值范围为 0~255。在编写 shell 脚本时,良好的做法是:如果一切正常,脚本退出时就返回 0;如果运行过程中出错,则返回非 0 值。我们推荐只使用 0~127 作为返回值,因为 shell 用 128+N 代表被信号 N“杀死”。另外,如果使用的值大于 255 或小于 0,则会出现值回绕。可以用 exit 语句(如 exit 1 或 exit 0)返回退出状态。但要注意,读取命令退出状态的机会只有一次。

$ badcommand
# 运行失败……
$ echo $?
1
$ echo $?
0
$

为什么第二个 echo 的结果是 0 ?它报告的其实是第一个 echo 命令的退出状态。第一次输入echo $? 时,结果是 1,这是 badcommand 的返回值。但是该 echo 命令本身是成功执行的,因此最新的退出状态就是 0(表示成功)。因为检查退出状态的机会只有一次,所以很多 shell 脚本会立即将退出状态保存到其他 shell 变量中。

$ badcommand
# 运行失败……
$ STAT=$?
$ echo $STAT
1
$ echo $STAT
1
$

我们将退出状态值保存在变量 $STAT 中,以便随后检查。

尽管这个示例是在命令行中展示的,但是 $? 这种变量的真正用途是在脚本编写方面。如果在屏幕上观看命令运行,通常可以看出该命令是否正常。但在脚本中,命令运行时也许无人值守。

bash 的一大特点是,脚本语言与在终端窗口提示符下键入的命令完全相同。在编写脚本时,这使得检查语法和逻辑要容易得多。

退出状态多用于脚本和 if 语句中,根据所执行命令的成功与否采取不同的处理方式。下面这个示例比较简单,但我们后续还会讨论这个话题。

somecommand
...
if (( $? )) ; then echo failed ; else echo OK; fi

(()) 对算术表达式进行求值;

我们不推荐使用负数。shell 可以接受负数,也不会报错,但结果并不如你所愿。

$ bash -c 'exit -2' ; echo $?
254

$ bash -c 'exit -200' ; echo $?
56

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!