我知道在bash test
的情况下,需要在变量周围使用引号:
$ var=; [ "$var" = 1 ] || echo 'variable var not set'
variable var not set
$ var=; [ $var = 1 ] || echo 'variable var not set'
bash: [: =: unary operator expected
variable var not set
$
但是,如果我不在变量周围使用引号,为什么我会收到这个“一元运算符预期”错误?换句话说,$ var意味着测试它是否没有引号?
答案 0 :(得分:2)
拥有script.sh
var=
[ $var = 1 ] || echo 'variable var not set'
使用bash -x
运行 - 并获取
+ var=
+ '[' = 1 ']' #<--------- see this
script.sh: line 3: [: =: unary operator expected
+ echo 'variable var not set'
variable var not set
因为$var
为空(未设置),测试中出现空字符串,导致语法错误。
如果你使用[[
- bash扩展名
var=
[[ $var = 1 ]] || echo 'variable var not set'
再次bash -x
+ var=
+ [[ '' = 1 ]]
+ echo 'variable var not set'
variable var not set
使用[[
代替[
可以让您获得更多灵活性,但价格更高。它不可移植,没有在POSIX中定义等等......
无论如何,是一个好的做法引用每个变量。例如,如果变量将保存带有以下空格的文件名:file name.txt
- 在没有引号的扩展上,您将获得两个单词通常会导致错误。
如果你想深入了解bash的工作原理,那么当bash开始评估你的脚本时会做以下事情:
如您所见,最后一个是removing quotes
。
您还需要了解,当bash在最后阶段进行评估时,您使用变量内容获得替换(扩展)的$variable
。因此,当变量为空时被替换为空字符串和表达式
$var=
[ $var = 1 ]
完全按照
进行评估[ = 1]
什么是(当然)错误。