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\”时,双引号将失去意义,并将按原样进行计算

    e、 g如果您有
    value=34
    ,则
    \“$value\”
    将使用双引号计算为
    “34”
    。如果该值与您的情况一样为空,则
    \“$value\”
    将计算为


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

    反斜杠?第二个参数传递一个双引号,后跟nothing和一个双引号作为要测试空性的参数,两个双引号不是空字符串。第一个传递一个空字符串;引号已删除,空字符串为空字符串。请添加标记以指示您正在使用的shell。我猜是bash,但我不想假设。转义引号将它们从语法(向shell提供如何理解其他数据的指令)更改为文字(即数据本身)。因为您随后将引号本身作为数据传递,所以作为测试参数提供的数据永远不能为null。您希望转义引号到底做什么?反斜杠?第二个参数传递一个双引号,后跟nothing和一个双引号作为要测试空性的参数,两个双引号不是空字符串。第一个传递一个空字符串;引号已删除,空字符串为空字符串。请添加标记以指示您正在使用的shell。我猜是bash,但我不想假设。转义引号将它们从语法(向shell提供如何理解其他数据的指令)更改为文字(即数据本身)。因为您随后将引号本身作为数据传递,所以作为测试参数提供的数据永远不能为null。您希望转义引号到底做什么?