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

z0qdvdin  于 6个月前  发布在  Shell
关注(0)|答案(4)|浏览(69)

我尝试了以下脚本:

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


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

mftmpeh8

mftmpeh81#

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"

字符串

u2nhd7ah

u2nhd7ah2#

当shell读到

if [ "$var1" = "$var2" ]

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

if [ "$var1"= "$var2" ]


[仅获得3个参数:$var 1的扩展,附加'=',$var 2的扩展和''。当它仅获得3个参数时,它期望最后一个参数是']',第一个参数是一元运算符。

vs91vp4v

vs91vp4v3#

为了补充现有的解释,"$var1"="$var2"只是一个单一的非空字符串,因此在条件中总是计算为true。

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

字符串
上面的命令将始终打印出true(即使var1var2为空)。

xe55xuns

xe55xuns4#

在bash中,最好使用

x="test"
y="test"
if [[ "${x}" = "${y}" ]]; then
    echo "Equals"
else
    echo "No equals"
fi

字符串

相关问题