&& 和 || 的使用令人困惑运营商

&& 和 || 的使用令人困惑运营商

我正在浏览一个/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这是因为expr1AND都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) 类似||- 但短路是相反的。

相关内容