在 bash 中比较整数、字符串和二进制时,我应该使用哪个引号(单引号或双引号),为什么?

在 bash 中比较整数、字符串和二进制时,我应该使用哪个引号(单引号或双引号),为什么?

在比较不同的字符串/整数时使用单引号括起来是否错误?

我在脚本中同时使用了单引号和双引号,大多数情况下它们都有效,但必须有规则来保持脚本的一致性。

那么我应该在哪一部分使用哪句话以及为什么?

答案1

选择在比较中使用单引号还是双引号时需要注意的一些事项:

扩展应该有效吗?

单引号基本上意味着您想要字符串的字面值。因此,在您想要进行比较的大多数情况下,它们并不是真正有用,因为通常您会想要比较变量。比较“$variable1”和“$variable2”每次都会得到错误的结果,因为您将比较文字字符串而不是变量值。

双引号仍然允许进行一些扩展(查看man bash页面的“引用”部分以获取更多详细信息)。在上面的示例中,“$variable1”和“$variable2”实际上会扩展为变量中包含的值,然后进行比较。

注意空字符串!

当使用test比较字符串的值时,请注意,扩展空字符串而不用双引号引起来可能会导致语法错误。例如,以下代码可以运行并让您认为它没有错误:

str="STRING"
if [ $str = "STRING" ]; then
    echo "EQUAL"
fi

但是,如果在某个时候你有一个空字符串,bash 会抱怨需要一个一元运算符。这是因为代码将扩展为:

str=""
if [ = "STRING" ]; then
    echo "EQUAL"
fi

And=不是一元运算符,尽管它后面只有一个参数。为了避免这种情况,请在比较中对变量名称使用双引号,如下所示:

str="STRING"
if [ "$str" = "STRING" ]; then
    echo "EQUAL"
fi

在选择引号时,还需记住其他事项(例如转义某些特殊字符 -$、`、\ 和 !当启用历史扩展时- 在双引号上),但基本上,如果您想要文字字符串,请使用单引号。当您需要一些扩展才能工作时,请使用双引号。如果需要,您也可以混合它们(这可以避免一些转义):

hello='Hello World'
mystring="$hello"'!'
echo "$mystring"

相关内容