逻辑运算
学习逻辑运算如何帮助我们比较数字。
比较运算符
[[ 运算符在 if 语句中用于比较整数时不够方便。该运算符使用双字母缩写来表示数值之间的关系。例如,-gt 缩写表示“大于”。当我们改用 (( 运算符时,可以直接使用常规的比较符号,如 >、< 和 =。
以下是一个示例。假设我们要将一个变量与数字 5 进行比较,可以这样写 if 语句:
1if ((var < 5)) 2then 3 echo "变量小于 5" 4fi
No configuration found for ID: b42736689da14845162c4a0ad3e47864452840af3e03f821cdce388b8f2b50d9
这段代码使用了 (( 运算符进行算术求值。我们也可以用内置的 let 命令替代它,效果相同:
1if let "var < 5" 2then 3 echo "变量小于 5" 4fi
然而,我们应始终优先使用 (( 运算符。
算术求值与展开的区别
算术求值和算术展开之间存在一个重要区别。根据 POSIX 标准,任何程序或命令成功时返回零退出状态,失败时返回 1 到 255 之间的状态码。Shell 将退出状态解释为:零表示“真”,非零表示“假”。如果应用这一规则,算术展开的结果会被反转;而算术求值的结果则不会被反转。
算术求值等同于内置的 let 命令,因此遵循 POSIX 标准,与其他命令一样。算术展开是在另一个命令的上下文中执行的,其结果取决于解释器的实现。
假设我们使用算术展开 $(( )),Bash 会解释其结果:如果 (( 中的条件为“真”,则返回 1;否则返回 0。C 语言也以同样的方式处理布尔表达式。
下面的例子将展示算术展开与算术求值之间的差异。以下 Bash 命令将变量 var 与数字 5 进行比较:
1((var < 5)) && echo "变量小于 5"
此命令包含算术求值。因此,当 var 小于 5 时,(( 运算符成功执行,根据 POSIX 标准返回零退出状态,随后 echo 输出消息。
而当我们将 (( 运算符用于算术展开形式时,结果不同。以下命令完成相同的比较:
1echo "$((var < 5))"
当条件为真时,echo 命令输出数字 1。如果你熟悉 C 语言,就会预期这样的结果。
逻辑运算
我们可以在 (( 运算符的算术求值形式中使用逻辑运算,其行为与 Bash 的逻辑运算符一致。
以下是一个逻辑运算的应用示例。下面的 if 条件同时比较 var 变量与数字 1 和 5:
1if ((1 < var && var < 5)) 2then 3 echo "变量大于 1 且小于 5" 4fi
该条件仅在两个表达式都为真时成立。
逻辑或(OR)运算也类似:
1if ((var < 1 || 5 < var)) 2then 3 echo "变量小于 1 或大于 5" 4fi
只要两个表达式中至少有一个为真,条件就为真。
很少直接对某个数字使用逻辑非(NOT)运算。通常我们用它来否定某个变量或表达式的值。如果对一个数字应用逻辑非,其输出符合 POSIX 标准:零表示“真”,非零表示“假”。例如:
1if ((! var)) 2then 3 echo "变量等于真或零" 4fi
该条件在 var 变量等于零时为真。
Quiz
输出结果为:
1Condition is passed
解释:
变量 var 的值为 7。
条件 (! (var > 8)) 表示“var 大于 8”这个判断的相反结果。
由于 7 不大于 8,所以 (var > 8) 为假,取反后 (! (var > 8)) 为真。
因此 if 条件成立,执行 echo "Condition is passed"。