在 bash 手册中,第 6.5 节 Shell 算术说
<= >= < > comparison
== != equality and inequality
&& logical AND
|| logical OR
Run Code Online (Sandbox Code Playgroud)
它们的含义似乎暗示它们用于条件表达式。但它们出现在算术表达式部分。
那么它们可以用在条件表达式中吗?
在 6.4 节中,我们已经有了条件表达式的运算符,类似于<=,>=,<,>,==,!=
算术表达式:
arg1 操作 arg2
OP 是“-eq”、“-ne”、“-lt”、“-le”、“-gt”或“-ge”之一。如果 arg1 分别等于、不等于、小于、小于或等于、大于或大于或等于 arg2,则这些算术二元运算符返回 true。Arg1 和 arg2 可以是正整数或负整数。
我们也已经有了用于条件表达式的运算符,它们类似于算术表达式&&
和||
用于算术表达式:
-a
而-o
对于test
即[...]
&&
并||
为[[...]]
。既然我们已经为条件表达式引入了运算符,为什么我们还需要为算术表达式引入那些类似的运算符?
它们可以在测试命令中使用吗?
我们知道if
后面跟着一个测试命令
if 命令的语法是:
Run Code Online (Sandbox Code Playgroud)if test-commands; then consequent-commands; [elif more-test-commands; then more-consequents;] [else alternate-consequents;] fi
[...]
并且[[...]]
都在其中使用条件表达式并创建测试命令。他们可以接受算术表达式吗?
让我什至感到困惑的是,它们中的算术表达式何时[...]
和[[...]]
使用它们作为测试命令,[...]
行为不正确,而[[...]]
正确:
$ if [ 1 > 2 ]; then echo h; else echo b; fi
h
$ if [ 1 < 2 ]; then echo h; else echo b; fi
h
$ if [[ 1 < 2 ]]; then echo h; else echo b; fi
h
$ if [[ 1 > 2 ]]; then echo h; else echo b; fi
b
Run Code Online (Sandbox Code Playgroud)这很简单。你只需要了解[]
,[[]]
和(())
完全不同的野兽。
[ expression ]
只是对程序的调用[
(只是 的不同名称test
)并将表达式作为参数,就像 bash 中的所有命令调用一样。这意味着,您必须在参数之间使用空格,尤其是 after[
和 before ]
,并且必须对关键字和特殊字符进行转义或引用,并且必须以通常的方式扩展变量。
在表达式中,-gt, -lt
和相关用于数值比较,而>, <
和排序用于字符串比较。认为[
与 bash 无关,只是调用一个命令来计算表达式并返回 0(真)或非零(假),就像所有程序一样。
布尔运算符&&
并且||
不能在那里使用,因为它们被 bash 解释而不是test
作为参数传递给。-a
并-o
改为使用。但是你总是可以做[ test1 ] && [ test2 ] || [ test3 ]
,这是 3 次测试调用,由bash
通常的布尔运算符组合而成(即,如果第一个失败,则跳过第二个)。
请注意,它bash
仍然带有自己的[
(builtin) 实现,但这不会改变它在语法上的处理方式。
[[ ]]
并且(( ))
不是命令的内置替代品,而是特殊语法的一部分,因此适用不同的规则。有关如何处理变量名通配符的详细信息,请参见手册页。布尔运算符&&
并||
具有通常的含义。
将[[ ]]
一个字符串是为中心:所有comparsions是字符串(但更“现代”,现场感知比[
,虽然test
可能是依赖于平台)。它还处理文件测试、正则表达式等。
的(( ))
是算术表达式。变量名不需要$
在那里,你大多可以在那里写数学表达式 - 当然包括比较(这是数字)。这种情况下的比较与任何其他算术表达式没有什么不同,true 为 1,false 为 0,您可以编写类似(( x=y*(z>4) ))
. 如果在条件表达式中使用,非零为真,零为假。您还可以将结果捕获为$(( ))
.
所以:
[[ ]]
字符串条件、模式匹配和文件测试(( ))
算术表达式和条件[ ]
测试命令:处理布尔运算符和比较运算符的特殊非标准语法 归档时间: |
|
查看次数: |
10438 次 |
最近记录: |