bash内置测试如何处理变量而没有引号?

时间:2014-04-02 14:48:40

标签: bash

我知道在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意味着测试它是否没有引号?

1 个答案:

答案 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开始评估你的脚本时会做以下事情:

  1. 解析和词法分析
  2. 扩张
    1. 支撑扩张
    2. tidle expansion
    3. 变量扩展
    4. 算术和其他替代
    5. 命令替换
    6. 分词
    7. 文件名生成(globbing)
  3. 删除引号
  4. 如您所见,最后一个是removing quotes

    您还需要了解,当bash在最后阶段进行评估时,您使用变量内容获得替换(扩展)的$variable。因此,当变量为空时被替换为空字符串和表达式

    $var=
    [ $var = 1 ]
    

    完全按照

    进行评估
    [ = 1]
    

    什么是(当然)错误。