Bash Shell命令运行成功后执行下一个命令

你需要运行一些命令,但其中部分命令需要在其他命令运行成功的情况下执行。例如,你想要切换到临时目录(使用 cd 命令),然后删除其中的所有文件。但如果 cd 命令失败(例如,没有权限进入该目录或者敲错了目录名),则不能删除任何文件。

解决方案

可以用 cd 命令的退出状态($?)配合 if 语句来实现仅当 cd 命令成功时执行 rm 命令。

cd mytmp
if (( $? == 0 )); then rm * ; fi

以下写法更好,它更清晰地展现并诠释了我们的意图。

if cd mytmp; then rm * ; fi

讨论

如果手动敲入命令,显然用不着这么做。因为可以看到 cd 命令出现的任何错误,所以也就不会再用 rm 命令。但是写脚本就是另一回事了,对于示例中这样的脚本,进行测试是非常有必要的,这可以确保不会意外地将所在目录中的文件全部删除。

假设在错误的目录中运行这个脚本,该目录下并没有子目录 mytmp,那么 cd 命令会失败,当前目录仍保持不变。如果少了 if 语句(检查 cd 命令是否失败),就会继续执行脚本中的下一条语句 rm *,删除当前目录内的所有文件。要这么看的话,if 语句还真是不能少。

那么变量 $? 中的值是怎么来的?这个值是命令的退出码(参考命令是否成功运行)。C 语言程序员会将其作为提供给 exit() 函数的参数值,例如,exit(4); 会返回 4。对于 shell 而言,退出码 0 代表成功,非 0 则代表失败。

如果正在编写 bash 脚本,那么要确保明确设置了返回值,以便 $? 得以正确设置。如果不这样做,$? 的值则是最后执行的那个命令的返回值,但这未必是你想要的结果。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!