Shell 转义双引号的不同行为
我有一个空变量。当我这样做的时候Shell 转义双引号的不同行为,shell,Shell,我有一个空变量。当我这样做的时候 if[-z“$value”];然后回应“你好”;fi 输出是hello 但是,当我转义双引号时,即 if[-z\“$value\”];然后回应“你好”;fi 屏幕上没有打印hello 上述两个命令之间的区别是什么?如果[[-z“$value”];然后回应“你好”;fi检查变量$value中的字符串值是否为非空。但是if[-z\“$value\”];然后回应“你好”;fi(假设$value不包含空格)检查以“开头并以结尾的字符串是否为非空。但它从来都不是,因为它总
if[-z“$value”];然后回应“你好”;fi
输出是hello
但是,当我转义双引号时,即
if[-z\“$value\”];然后回应“你好”;fi
屏幕上没有打印hello
上述两个命令之间的区别是什么?
如果[[-z“$value”];然后回应“你好”;fi
检查变量$value
中的字符串值是否为非空。但是if[-z\“$value\”];然后回应“你好”;fi
(假设$value
不包含空格)检查以“
开头并以结尾的字符串是否为非空。但它从来都不是,因为它总是至少包含两个字符;然后回应“你好”;fi
检查变量$value
中的字符串值是否为非空。但是if[-z\“$value\”];然后回应“你好”;fi
(假设$value
不包含空格)检查以“
开头并以结尾的字符串是否为非空。但它从来都不是,因为它总是至少包含两个字符。这是因为在第一条语句中,变量被展开,结果语句为null
而在第二个示例中,它扩展为“
。要查看差异,请考虑这两个回音语句,
$ echo "$value"
$ echo \"$value\"
""
第一个是null,而第二个不是。这是因为在第一条语句中,变量被展开,结果语句为null
而在第二个示例中,它扩展为“
。要查看差异,请考虑这两个回音语句,
$ echo "$value"
$ echo \"$value\"
""
第一个是空的,第二个不是空的。Shell中有三种引号
单引号(“”)
这些引号之间的所有特殊字符都会失去其特殊意义
所以echo'$VALUE'
将逐字打印$VALUE
,因为$失去了它的特殊含义
内单引号
双引号(“”)
这些引号之间的大多数特殊字符都失去了它们的特殊意义,除了$等例外
后引号(
)
反引号之间的任何内容都将被视为命令并将被执行
反斜杠
紧跟在反斜杠后面的任何字符都将失去其特殊含义
因此,在您的情况下,当您因为反斜杠而说“$value\”
时,双引号将失去意义,并将按原样进行计算
e、 g如果您有value=34
,则\“$value\”
将使用双引号计算为“34”
。如果该值与您的情况一样为空,则\“$value\”
将计算为”
所以它不是空的,而是一个带双引号的字符串,这就是为什么不能通过空检查。Shell中有三种引号
echo'$VALUE'
将逐字打印$VALUE
,因为$失去了它的特殊含义
内单引号
)
反引号之间的任何内容都将被视为命令并将被执行
反斜杠
紧跟在反斜杠后面的任何字符都将失去其特殊含义
value=34
,则\“$value\”
将使用双引号计算为“34”
。如果该值与您的情况一样为空,则\“$value\”
将计算为”
所以它不是空的,而是一个带双引号的字符串,这就是为什么空检查失败。反斜杠?第二个参数传递一个双引号,后跟nothing和一个双引号作为要测试空性的参数,两个双引号不是空字符串。第一个传递一个空字符串;引号已删除,空字符串为空字符串。请添加标记以指示您正在使用的shell。我猜是bash,但我不想假设。转义引号将它们从语法(向shell提供如何理解其他数据的指令)更改为文字(即数据本身)。因为您随后将引号本身作为数据传递,所以作为测试参数提供的数据永远不能为null。您希望转义引号到底做什么?反斜杠?第二个参数传递一个双引号,后跟nothing和一个双引号作为要测试空性的参数,两个双引号不是空字符串。第一个传递一个空字符串;引号已删除,空字符串为空字符串。请添加标记以指示您正在使用的shell。我猜是bash,但我不想假设。转义引号将它们从语法(向shell提供如何理解其他数据的指令)更改为文字(即数据本身)。因为您随后将引号本身作为数据传递,所以作为测试参数提供的数据永远不能为null。您希望转义引号到底做什么?