如果不被空间包围,为什么等于运算符不起作用?

And*_*sne 34 syntax bash shell scripting

我尝试了以下脚本

#!/bin/bash
var1="Test 1" 
var2="Test 2"
if [ "$var1"="$var2" ] 
  then 
    echo "Equal" 
  else 
    echo "Not equal"
fi
Run Code Online (Sandbox Code Playgroud)

它给了我Equal.虽然它应该印刷Not equal

只有当我在=其周围插入空间时才能按预期工作

if [ "$var1" = "$var2" ] 
Run Code Online (Sandbox Code Playgroud)

并打印 Not equal

为什么会这样?为什么"$var1"="$var2"不一样"$var1" = "$var2"

而且,当我写作时if [ "$var1"= "$var2" ],它给了

line 4: [: Test 1=: unary operator expected
Run Code Online (Sandbox Code Playgroud)

它是什么意思?它如何期待一元运算符?

CB *_*ley 60

test(或[ expr ])是内置函数.与bash中的所有函数一样,您将其参数作为空格分隔的单词传递.

正如bash builtins的手册页所述:"每个运算符和操作数必须是一个单独的参数."

这就是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"
Run Code Online (Sandbox Code Playgroud)

  • 该手册页适用于`test`内置函数.在bash中,变量赋值是shell语法的一部分,它不是函数.它不需要空格. (4认同)

Wil*_*ell 7

当shell读取时

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

它调用命令[带有4个参数.无论是内置命令还是外部命令都无关紧要,但它可能有助于理解它可能是外部命令/ bin/[.第二个参数是文字'=',第四个参数是']'.但是,当shell读取时

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

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