我有一个空变量。当我做的时候
if [[ -z "$value" ]]; then echo "hello"; fi
输出是hello
然而,当我逃避双引号时,即
if [[ -z \"$value\" ]]; then echo "hello"; fi
你好不会打印在屏幕上。
上述两个命令有什么区别?
答案 0 :(得分:1)
这是因为在第一个语句中,变量被扩展,结果语句为null。
而在第二个它扩展到""
。要查看差异,请考虑两个echo语句,
$ echo "$value"
$ echo \"$value\"
""
第一个是null,而第二个不是。
答案 1 :(得分:1)
Shell中有三种引用。
单引号('')
这些引号之间的所有特殊字符都失去了特殊含义。
所以echo '$VALUE'
将逐字打印$VALUE
因为$失去了它的特殊含义
单引号内。
双引号("")
这些引号之间的大多数特殊字符都会失去特殊含义,例如$等等。
返回引用()
后引号之间的任何内容都将被视为命令并将被执行。
<强>反斜杠强>
反斜杠后面的任何字符都会失去其特殊含义。
所以在你的情况下,当你说\"$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
不包含空格)检查以"
开头并以"
结尾的字符串是否为非空。但它永远不会,因为它总是包含至少两个字符。