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)
当shell读取时
if [ "$var1" = "$var2" ]
它调用命令[带有4个参数.无论是内置命令还是外部命令都无关紧要,但它可能有助于理解它可能是外部命令/ bin/[.第二个参数是文字'=',第四个参数是']'.但是,当shell读取时
if [ "$var1"= "$var2" ]
[只获得3个参数:附加'='的$ var1的扩展,$ var2的扩展和']'.当它只获得3个参数时,它期望最后一个参数为']',第一个参数为一元运算符.