为什么等于运算符如果没有被空格包围就不起作用?

问题描述 投票:0回答:4

我尝试了以下脚本:

#!/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

这是什么意思?为什么它需要一元运算符?

bash shell syntax scripting
4个回答
84
投票

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"

8
投票

当 shell 读取时

if [“$var1”=“$var2”]

它使用 4 个参数调用命令 [。 [ 是内置命令还是外部命令无关紧要,但可能有助于理解它可能是外部命令 /bin/[。第二个参数是文字“=”,第四个参数是“]”。然而,当 shell 读取

if [“$var1”=“$var2”]

[ 仅获取 3 个参数:附加 '=' 的 $var1 扩展、$var2 的扩展和 ']'。当它仅获得 3 个参数时,它期望最后一个参数为 ']',第一个参数为一元运算符。


3
投票

补充现有的解释,

"$var1"="$var2"
只是一个非空字符串,因此在条件中始终评估为 true。

[ "$var1"="$var2" ] && echo true

上述命令将始终打印出

true
(即使
var1
var2
为空)。


-2
投票

在 bash 中最好使用 [[ ]]:

x="test"
y="test"
if [[ "${x}" = "${y}" ]]; then
    echo "Equals"
else
    echo "No equals"
fi
© www.soinside.com 2019 - 2024. All rights reserved.