逃避双引号的不同行为

时间:2016-11-22 01:26:56

标签: shell

我有一个空变量。当我做的时候

if [[ -z "$value" ]]; then echo "hello"; fi

输出是hello

然而,当我逃避双引号时,即

if [[ -z \"$value\" ]]; then echo "hello"; fi

你好不会打印在屏幕上。

上述两个命令有什么区别?

3 个答案:

答案 0 :(得分:1)

这是因为在第一个语句中,变量被扩展,结果语句为null。

而在第二个它扩展到""。要查看差异,请考虑两个echo语句,

$ echo "$value"

$ echo \"$value\"
""

第一个是null,而第二个不是。

答案 1 :(得分:1)

Shell中有三种引用。

  1. 单引号('')

      

    这些引号之间的所有特殊字符都失去了特殊含义。

    所以echo '$VALUE'

    将逐字打印$VALUE因为$失去了它的特殊含义 单引号内。

  2. 双引号("")

      

    这些引号之间的大多数特殊字符都会失去特殊含义,例如$等等。

  3. 返回引用(

      

    后引号之间的任何内容都将被视为命令并将被执行。

    <强>反斜杠

      

    反斜杠后面的任何字符都会失去其特殊含义。

  4. 所以在你的情况下,当你说\"$value\"因为反斜杠时,双引号将失去意义并将按原样进行评估。

    例如,如果您有value=34,那么\"$value\"将使用双引号评估为"34"。如果值为null,则\"$value\"将评估为""

    所以它不是null,而是一个带双引号的字符串,这就是为什么你的空检查失败了。

答案 2 :(得分:0)

if [[ -z "$value" ]]; then echo "hello"; fi检查变量$value中的字符串值是否为非空。但是if [[ -z \"$value\" ]]; then echo "hello"; fi(假设$value不包含空格)检查以"开头并以"结尾的字符串是否为非空。但它永远不会,因为它总是包含至少两个字符。