我尝试了以下脚本
#!/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
它是什么意思?为什么它是预期的一元运算符?
4条答案
按热度按时间58wvjzkj1#
test
(或[ expr ]
)是一个内置函数,和bash中的所有函数一样,它的参数是用空格分隔的单词传递的。正如bash内置程序的手册页所述:“每个运算符和操作数都必须是单独的参数.”
这就是bash和大多数其他Unix shell的工作方式。
变量赋值不同。
在bash中,变量赋值的语法如下:
name=[value]
。不能在=
周围放置不带引号的空格,因为bash不会将其解释为您想要的赋值。bash将大多数单词列表视为带参数的命令。例如
bvjxkvbb2#
当shell读取
它使用4个参数调用命令[。[是内置命令还是外部命令无关紧要,但了解它可能是外部命令/bin/[可能会有所帮助。第二个参数是文字“=”,第四个参数是“]”。但是,当shell读取
[仅获取3个参数:追加了“=”的$var1的扩展、$var2的扩展和“]”。当它只获取3个参数时,它希望最后一个参数为“]”,第一个参数为一元运算符。
ktecyv1j3#
为了补充现有的解释,
"$var1"="$var2"
只是一个非空字符串,因此在条件中总是计算为true。上述命令将始终打印
true
(即使var1
和var2
为空)。vptzau2j4#
在bash中,最好使用: