为什么以下字符串比较返回不同的结果?



以下命令之间有什么区别,为什么它们不产生相同的输出?

echo $[ "a" == "a" ]
1

echo $(( "a" == "a" ))
1
[ "a" == "a" ]; echo $?;
0
对我来说

,这些似乎是相同的操作,但前两个附加了 $ 返回 false...

这是不正确的。前两个表达式是算术表达式。它们产生数值结果。 与许多语言中常见一样,布尔值 True 的计算结果为1的整数值,而 False 的计算结果为0

请注意,$[...]$((...))是等效的,但前者已弃用,不再记录。

。而第三个返回 true

这也不是真的。 在这里,您正在查看命令的返回代码,而不是像前两个示例中那样打印出表达式的值。 命令不返回布尔信息;它们返回一个整数,指示它们是否成功(返回代码为 0(或不成功(任何非零返回代码(。


关于你的问题,false命令不返回"false";如果你阅读手册页,它会说:

错误 - 什么都不做,不成功

也就是说,它是一个不执行任何操作并返回错误代码(即非零退出代码,在本例中为1(的命令。 当然,true是相似的,除了它返回一个成功的退出代码(即0(。

echo $[ "a" == "a" ]

使用已弃用的整数扩展语法,该语法已替换为$(( ... ))

echo $(( "a" == "a" ))

使用所谓的算术展开:在$(( ... ))中,您可以拥有在返回值之前计算的逻辑和数值表达式。

[ "a" == "a" ]; echo $?

以标准 bash 方式进行逻辑测试:当程序成功执行时,该程序的返回代码为 0,否则为非零。[实际上是程序的另一个名称,称为test,当它测试的表达式为真时,它返回成功(即0(。

不在您的列表中,但相关:

(( "a" == "a" )); echo $?
0

这将执行算术扩展,如果结果为 true,则返回 success (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。(这是布尔表达式的值与计算布尔表达式的命令的结果之间的差异。整数比较是使用-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

相关内容

  • 没有找到相关文章

最新更新