我正在浏览一个/etc/rc.d/init.d/sendmail
文件(我知道这很少用过,但我正在准备考试),我对&&
和||
运算符有点困惑。我读过它们可以在诸如以下的语句中使用:
if [ test1 ] && [ test2 ]; then
echo "both tests are true"
elif [ test1 ] || [ test2 ]; then
echo "one test is true"
fi
但是,此脚本显示单行语句,例如:
[ -z "$SMQUEUE" ] && SMQUEUE="QUEUE"
[ -f /usr/sbin/sendmail ] || exit 0
这些似乎使用&&
和||
运算符来根据测试引发响应,但我无法挖掘有关这些运算符的特定用法的文档。谁能解释一下它们在这种特定情况下的作用吗?
答案1
&&
仅当左侧的退出状态为零(即 true)时,才会评估右侧。||
相反:只有当左侧退出状态非零(即 false)时,它才会评估右侧。
你可以认为[ ... ]
是一个有返回值的程序。如果内部测试的结果为真,则返回零;否则返回非零。
例子:
$ false && echo howdy!
$ true && echo howdy!
howdy!
$ true || echo howdy!
$ false || echo howdy!
howdy!
额外说明:
如果你这样做which [
,你可能会发现它[
确实指向一个程序!不过,它实际上通常并不是在脚本中运行的; runtype [
看看实际运行了什么。如果您想尝试使用该程序,只需提供完整路径,如下所示:/bin/[ 1 = 1
。
答案2
这是我的备忘单:
- "A ; B" 运行 A,然后运行 B,无论 A 是否成功
- "A && B" 如果 A 成功则运行 B
- "A || B" 如果 A 失败则运行 B
- “A &” 在后台运行 A。
答案3
扩展@Shawn-j-Goff上面的答案,&&
是一个逻辑AND,并且||
是一个逻辑OR。
看这高级 Bash 脚本指南的一部分。链接中的部分内容供用户参考如下。
&& 和
if [ $condition1 ] && [ $condition2 ]
# Same as: if [ $condition1 -a $condition2 ]
# Returns true if both condition1 and condition2 hold true...
if [[ $condition1 && $condition2 ]] # Also works.
# Note that && operator not permitted inside brackets
#+ of [ ... ] construct.
||或者
if [ $condition1 ] || [ $condition2 ]
# Same as: if [ $condition1 -o $condition2 ]
# Returns true if either condition1 or condition2 holds true...
if [[ $condition1 || $condition2 ]] # Also works.
# Note that || operator not permitted inside brackets
#+ of a [ ... ] construct.
答案4
有一个“捷径”的概念。
何时(expr1 && expr2)
评估 -仅当评估为“true”expr2
时才评估。exp1
这是因为expr1
AND都expr2
必须为真才能(expr1 && expr2)
为真。如果expr1
计算结果为“false”,expr2
则不会计算(快捷方式),因为(expr1 && expr2)
已经是“flase”。
尝试以下操作 - 假设文件F1
存在且文件F2
不存在:
( [ -s F1 ] && echo "File Exists" ) # will print "File Exists" - no short cut
( [ -s F2 ] && echo "File Exists" ) # will NOT print "File Exists" - short cut
与 (or) 类似||
- 但短路是相反的。