为什么下面的字符串比较return会有不同的结果?
Why do the following string comparisons return different results?
以下命令之间有什么区别,为什么它们不产生相同的输出?:
echo $[ "a" == "a" ]
1
echo $(( "a" == "a" ))
1
[ "a" == "a" ]; echo $?;
0
To me, these seem like the same operations but the first two which are appended with $ return false...
这是不正确的。前两个表达式是算术表达式。它们产生 numeric 结果。正如在许多语言中常见的那样,布尔值 True 的计算结果为整数值 1
,而 False 的计算结果为 0
.
注意 $[...]
和 $((...))
是等价的,但前者 is deprecated 不再记录。
...while the third returns true
这也不是真的。此处您查看的是命令的 return 代码,而不是像前两个示例中那样打印出表达式的值。命令不 return 布尔信息;他们 return 一个整数,指示他们是否成功(return 代码 0)或不成功(任何非零 return 代码)。
关于您的问题,false
命令不会 return "false";如果您阅读手册页,它会说:
false - do nothing, unsuccessfully
也就是说,它是一个不执行任何操作的命令,并且 return 是一个错误代码(即非零退出代码,在本例中为 1
)。 true
当然是类似的,除了它 return 是一个成功的退出代码(即 0
)。
echo $[ "a" == "a" ]
使用已弃用的整数扩展语法,已被 $(( ... ))
取代。
echo $(( "a" == "a" ))
使用所谓的算术扩展:在 $(( ... ))
中,您可以在 return 计算值之前计算逻辑和数值表达式。
[ "a" == "a" ]; echo $?
以标准 bash 方式进行逻辑测试:当程序成功执行时,程序的 return 代码为 0,否则为非零。 [
实际上是名为 test
的程序的另一个名称,当它测试的表达式为真时,return 成功(即 0)。
不在您的列表中,但相关:
(( "a" == "a" )); echo $?
0
这会进行算术扩展,如果结果为真,return就会成功 (0),而不是生成表达式本身的值。
[[ "a" == "a" ]]; echo $?
0
[[ ... ]]
是 bash 语法,用于直接进行条件测试而不是调用程序 test
。
一些示例用法
您将使用 $(( ... ))
来初始化变量或回显输出,就像您所做的那样:
foo=$(( 1 + 4))
echo $(( 5 + 7 ))
您可以在条件语句中使用 [ ... ]
、(( ... ))
和 [[ ... ]]
:
if [[ $a == bar ]]; then
echo $a is bar
fi
i=0
while (( i < 10 )); do
echo i=$i
i=$(( i + 1 ))
done
您的前两个执行算术比较(永远不要使用 $[...]
;它没有记录,已过时,并被 $((...))
取代——字面上——几十年前。在算术上下文中,字符串被递归地视为隐式参数扩展,直到生成整数。未定义的参数被视为 0。如果比较为真,则结果表达式的值为 1,如果为假,则为 0。比较:
$ echo $(( a == b )) # Compares 0 == 0
1
$ a=5; b=7
$ echo $(( a == b )) # Compares 5 == 7
0
最后一个执行字符串比较,符合预期。 [ ... ]
的退出状态在比较为真时为 0,为假时为 1。 (这是布尔表达式的 value 与计算布尔表达式的 command 的结果之间的差异。)进行整数比较使用 -eq
运算符。
$ [ a = a ]; echo $? # String comparison of the letter a to itself
0
$ [ a = b ]; echo $? # String comparison of the letter a to the letter b
1
$ unset a b
$ [ a -eq b ]; echo $? # Again, 0 -eq 0
0
$ a=5; b=7
$ [ "$a" -eq "$b" ]; echo $? # Again, 5 -eq 7
1
以下命令之间有什么区别,为什么它们不产生相同的输出?:
echo $[ "a" == "a" ]
1
echo $(( "a" == "a" ))
1
[ "a" == "a" ]; echo $?;
0
To me, these seem like the same operations but the first two which are appended with $ return false...
这是不正确的。前两个表达式是算术表达式。它们产生 numeric 结果。正如在许多语言中常见的那样,布尔值 True 的计算结果为整数值 1
,而 False 的计算结果为 0
.
注意 $[...]
和 $((...))
是等价的,但前者 is deprecated 不再记录。
...while the third returns true
这也不是真的。此处您查看的是命令的 return 代码,而不是像前两个示例中那样打印出表达式的值。命令不 return 布尔信息;他们 return 一个整数,指示他们是否成功(return 代码 0)或不成功(任何非零 return 代码)。
关于您的问题,false
命令不会 return "false";如果您阅读手册页,它会说:
false - do nothing, unsuccessfully
也就是说,它是一个不执行任何操作的命令,并且 return 是一个错误代码(即非零退出代码,在本例中为 1
)。 true
当然是类似的,除了它 return 是一个成功的退出代码(即 0
)。
echo $[ "a" == "a" ]
使用已弃用的整数扩展语法,已被 $(( ... ))
取代。
echo $(( "a" == "a" ))
使用所谓的算术扩展:在 $(( ... ))
中,您可以在 return 计算值之前计算逻辑和数值表达式。
[ "a" == "a" ]; echo $?
以标准 bash 方式进行逻辑测试:当程序成功执行时,程序的 return 代码为 0,否则为非零。 [
实际上是名为 test
的程序的另一个名称,当它测试的表达式为真时,return 成功(即 0)。
不在您的列表中,但相关:
(( "a" == "a" )); echo $?
0
这会进行算术扩展,如果结果为真,return就会成功 (0),而不是生成表达式本身的值。
[[ "a" == "a" ]]; echo $?
0
[[ ... ]]
是 bash 语法,用于直接进行条件测试而不是调用程序 test
。
一些示例用法
您将使用 $(( ... ))
来初始化变量或回显输出,就像您所做的那样:
foo=$(( 1 + 4))
echo $(( 5 + 7 ))
您可以在条件语句中使用 [ ... ]
、(( ... ))
和 [[ ... ]]
:
if [[ $a == bar ]]; then
echo $a is bar
fi
i=0
while (( i < 10 )); do
echo i=$i
i=$(( i + 1 ))
done
您的前两个执行算术比较(永远不要使用 $[...]
;它没有记录,已过时,并被 $((...))
取代——字面上——几十年前。在算术上下文中,字符串被递归地视为隐式参数扩展,直到生成整数。未定义的参数被视为 0。如果比较为真,则结果表达式的值为 1,如果为假,则为 0。比较:
$ echo $(( a == b )) # Compares 0 == 0
1
$ a=5; b=7
$ echo $(( a == b )) # Compares 5 == 7
0
最后一个执行字符串比较,符合预期。 [ ... ]
的退出状态在比较为真时为 0,为假时为 1。 (这是布尔表达式的 value 与计算布尔表达式的 command 的结果之间的差异。)进行整数比较使用 -eq
运算符。
$ [ a = a ]; echo $? # String comparison of the letter a to itself
0
$ [ a = b ]; echo $? # String comparison of the letter a to the letter b
1
$ unset a b
$ [ a -eq b ]; echo $? # Again, 0 -eq 0
0
$ a=5; b=7
$ [ "$a" -eq "$b" ]; echo $? # Again, 5 -eq 7
1