我尝试了以下脚本
#!/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 内置函数的手册页所述:“每个运算符和操作数必须是一个单独的参数。”
这正是 bash 和大多数其他 Unix shell 的工作方式。
变量赋值不同
在 bash 中,变量赋值的语法为:
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 读取时
if [ "$var1" = "$var2" ]
它调用带有 4 个参数的命令 [。 [ 是内置命令还是外部命令无关紧要,但可能有助于理解它可能是外部命令 /bin/[。第二个参数是文字“=”,第四个是“]”。然而,当 shell 读取
if [ "$var1"= "$var2" ]
[ 只得到 3 个参数:$var1 的扩展加上'=',$var2 的扩展,和']'。当它只有 3 个参数时,它期望最后一个参数是 ']',第一个参数是一元运算符。
为了补充现有的解释,
"$var1"="$var2"
只是一个单一的非空字符串,因此在条件中总是评估为真。
[ "$var1"="$var2" ] && echo true
以上命令将始终打印出
true
(即使var1
和var2
为空)。
在 bash 中最好使用 [[ ]]:
x="test"
y="test"
if [[ "${x}" = "${y}" ]]; then
echo "Equals"
else
echo "No equals"
fi