Bash Shell减少if数量,作为一名尽职尽责的程序员,你牢记着上节所讲的内容。你将相关的概念应用于最近编写的 shell 脚本,却发现其中充斥着检查各个命令返回值的 if 语句,导致脚本难以阅读。有没有什么别的办法呢?
解决方案
在 bash 中使用 && 运算符,根据条件执行命令。
cd mytmp && rm *
讨论
用 && 分隔两个命令,以此告诉 bash 先执行第一个命令,如果该命令成功(退出状态为 0),再执行第二个命令。这非常类似于用 if 语句检查第一个命令的退出状态,从而判断是否执行第二个命令。
cd mytmp
if (( $? == 0 )); then rm * ; fi
&& 语法会让人想起 C 语言中的逻辑 AND 运算符。如果了解逻辑运算(以及 C 语言),那么你应该记得在评估逻辑表达式 A AND B 时,如果(子)表达式 A 和(子)表达式 B 均为真,则整个表达式才为真。如果其中任何一个为假,则整个表达式为假。C 语言利用了这个事实,当编写if (A && B) { ... }
之类的表达式时,它会先评估表达式 A。如果为假,那么它甚至都不会再费事去评估 B,因为整个表达式的结果(假)已经由此(A 为假)确定了。
这跟 bash 有什么关系?如果第一个命令(&& 的左侧)的退出状态不为 0(失败),那么它就不会再评估第二个表达式,也就是说压根不会执行另一个命令。
要想彻底检查错误,但又不想到处出现 if 语句,可以设置 -e 标记,这样的话,只要脚本中有任何命令(排除在 while 循环和 if 语句中,因为其本身就要用到退出状态)出现错误(退出状态为非 0),bash 就会退出。
set -e
cd mytmp
rm *
设置了 -e 标记之后,shell 会在命令失败时退出。如果本例中的 cd 命令失败,脚本则直接退出,不再执行rm *
命令。但不推荐在交互式 shell 中这么做,因为如果 shell 退出,那么终端窗口也会随之消失。
酷客网相关文章:
评论前必须登录!
注册