在比较不同的字符串/整数时使用单引号括起来是否错误?
我在脚本中同时使用了单引号和双引号,大多数情况下它们都有效,但必须有规则来保持脚本的一致性。
那么我应该在哪一部分使用哪句话以及为什么?
答案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"