为什么等于操作员不工作,如果它不包括空间?
我试了下面的脚本
#!/bin/bash var1="Test 1" var2="Test 2" if [ "$var1"="$var2" ] then echo "Equal" else echo "Not equal" fi
它给了我Equal
。 虽然它应该打印Not equal
只有当我插入空间=
它按预期工作
if [ "$var1" = "$var2" ]
和打印Not equal
为什么这样? 为什么"$var1"="$var2"
与"$var1" = "$var2"
不一样?
此外,当我写了if [ "$var1"= "$var2" ]
,它给了
line 4: [: Test 1=: unary operator expected
这是什么意思? 它如何期待一元运算符?
test
(或[ expr ]
)是一个内置函数。 像bash中的所有函数一样,您将它的参数作为空白分隔的单词传递。
正如bash的man手册页所述:“每个运算符和操作数都必须是一个单独的参数。”
这只是bash和大多数其他Unix shell的工作方式。
variables赋值是不同的。
在bash中,一个variables赋值的语法是: name=[value]
。 因为bash不能把这个解释为你想要的任务, bash将大多数单词列表视为带参数的命令。
例如
# call the command or function 'abc' with '=def' as argument abc =def # call 'def' with the variable 'abc' set to the empty string abc= def # call 'ghi' with 'abc' set to 'def' abc=def ghi # set 'abc' to 'def ghi' abc="def ghi"
当shell读取
如果[“$ var1”=“$ var2”]
它调用命令[有4个参数。 无论是内置命令还是外部命令都是不相关的,但可能有助于理解它可能是外部命令/ bin / [。 第二个参数是文字'=',第四个是']'。 但是,当shell读取
如果[“$ var1”=“$ var2”]
[只获得3个参数:$ var1的扩展名为'=',$ var2和']'的扩展名。 当它只有3个参数时,它期望最后一个参数是']',第一个参数是一元运算符。
为了增加现有的解释, "$var1"="$var2"
只是一个非空string,因此总是在条件中评估为真。
[ "$var1"="$var2" ] && echo true
上面的命令将总是输出true
(即使var1
和var2
为空)。
在bash中最好的是使用[[]]:
x="test" y="test" if [[ "${x}" = "${y}" ]]; then echo "Equals" else echo "No equals" fi