Meerkat Asked: 2019-02-16 02:14:14 +0800 CST2019-02-16 02:14:14 +0800 CST 2019-02-16 02:14:14 +0800 CST 为什么在 [[ ]] 测试中使用双引号? 772 假设我们在 bash 脚本中有 2 个整数: value1=5 value2=3 那么为什么我们需要在测试的情况下使用双引号呢?例如: if [[ "$value1" -eq "$value2" ]] 为什么不只使用以下内容? if [[ $value1 -eq $value2 ]] 对我来说,双引号没有任何意义。 bash shell 5 个回答 Voted terdon 2019-02-16T02:42:06+08:002019-02-16T02:42:06+08:00 您实际上并不需要这里的引号。这是使用不带引号的变量是安全的极少数情况之一。您可以通过以下方式确认set -x: $ var1="" $ var2="3" $ set -x $ if [[ $var1 -eq $var2 ]]; then echo "match!"; else echo "no match!"; fi + [[ '' -eq 3 ]] + echo 'no match!' no match! $ if [[ "$var1" -eq "$var2" ]]; then echo "match!"; else echo "no match!"; fi + [[ '' -eq 3 ]] + echo 'no match!' no match! 正如您在上面看到的,引用和未引用的测试版本被 bash 解析为完全相同的东西。对于zsh支持运算符的任何其他 shell,我认为也是如此[[ ]]。 请注意,更便携的情况并非[ ]如此: $ if [ $var1 -eq $var2 ]; then echo "match!"; else echo "no match!"; fi + '[' -eq 3 ']' sh: [: -eq: unary operator expected + echo 'no match!' no match! [ ]与构造不同,该构造[[ ]]确实需要引用。 一些有用的链接可以了解更多关于何时以及为什么需要引用: 为什么我的 shell 脚本会因空格或其他特殊字符而窒息? 忘记在 bash/POSIX shell 中引用变量的安全隐患 什么时候需要双引号? jamesdlin 2019-02-16T05:18:59+08:002019-02-16T05:18:59+08:00 即使双引号不是必需的,使用它们的原因是: 良好实践/习惯:在这种情况下,它们不是必需的,但通常双引号是为了避免意外的分词。 因为value1andvalue2是可变的,你可能不知道它们包含什么。否则你可能会问,“为什么要为变量而不是检查而烦恼if [[ 5 -eq 3 ]]?或者更进一步,if当你已经知道 5 不等于 3 时,为什么还要烦恼呢?防御通常更好。(这是真的中不会发生分[[词,但不会发生分词的情况很少见。再次,请参阅第一点。) Best Answer glenn jackman 2019-02-16T08:07:23+08:002019-02-16T08:07:23+08:00 分词。 这个例子不太可能,但有可能,所以如果你想防御性地编码,用引号覆盖你的踪迹: $ set -x $ value1=5 + value1=5 $ value2=3 + value2=3 $ [ $value1 -eq $value2 ] + '[' 5 -eq 3 ']' 好的,到目前为止一切都很好。让我们把扳手扔进齿轮: $ IFS=456 + IFS=456 $ [ $value1 -eq $value2 ] + '[' '' -eq 3 ']' bash: [: : integer expression expected 哎呀。 $ [ "$value1" -eq "$value2" ] + '[' 5 -eq 3 ']' 啊。 framp 2019-02-17T13:44:38+08:002019-02-17T13:44:38+08:00 与您的问题没有直接关系,但我使用 如果 (( $value1 == $value2 )); 然后 当我比较数字时,您也不必使用引号。 domson 2019-02-21T04:06:16+08:002019-02-21T04:06:16+08:00 你是绝对正确的! 至少在这种情况下,双方括号内的引用完全没有意义。 但是因为我每天都使用双引号——特别是对于单方括号表达式,将参数传递给函数和脚本,以及有时变量赋值(这对于简单的声明完全没用)——我猜有些人,至少我这样做,本能地在变量扩展周围写上双引号。 双引号可以给你一种节省的感觉。这就像回家双引号。- D.库默 使用双引号因此而易于理解的好处——但只有在它有意义的情况下——是新接触 bash 的同事可以学习如何编写更稳定的脚本。它还强调了一个事实,即使用 bash 进行数据处理的艺术更多地是关于通过字段分隔符分隔数据流(包括变量)并通过过滤器将它们管道化。一旦您将数据块从流中分离出来,就用双引号将它们放在一起! 另一个好处可能是在代码高亮编辑器中带有双引号字符串的 bash 脚本具有更好的可读性。
您实际上并不需要这里的引号。这是使用不带引号的变量是安全的极少数情况之一。您可以通过以下方式确认
set -x
:正如您在上面看到的,引用和未引用的测试版本被 bash 解析为完全相同的东西。对于
zsh
支持运算符的任何其他 shell,我认为也是如此[[ ]]
。请注意,更便携的情况并非
[ ]
如此:[ ]
与构造不同,该构造[[ ]]
确实需要引用。一些有用的链接可以了解更多关于何时以及为什么需要引用:
即使双引号不是必需的,使用它们的原因是:
value1
andvalue2
是可变的,你可能不知道它们包含什么。否则你可能会问,“为什么要为变量而不是检查而烦恼if [[ 5 -eq 3 ]]
?或者更进一步,if
当你已经知道 5 不等于 3 时,为什么还要烦恼呢?防御通常更好。(这是真的中不会发生分[[
词,但不会发生分词的情况很少见。再次,请参阅第一点。)分词。
这个例子不太可能,但有可能,所以如果你想防御性地编码,用引号覆盖你的踪迹:
好的,到目前为止一切都很好。让我们把扳手扔进齿轮:
哎呀。
啊。
与您的问题没有直接关系,但我使用
当我比较数字时,您也不必使用引号。
你是绝对正确的!
至少在这种情况下,双方括号内的引用完全没有意义。
但是因为我每天都使用双引号——特别是对于单方括号表达式,将参数传递给函数和脚本,以及有时变量赋值(这对于简单的声明完全没用)——我猜有些人,至少我这样做,本能地在变量扩展周围写上双引号。
使用双引号因此而易于理解的好处——但只有在它有意义的情况下——是新接触 bash 的同事可以学习如何编写更稳定的脚本。它还强调了一个事实,即使用 bash 进行数据处理的艺术更多地是关于通过字段分隔符分隔数据流(包括变量)并通过过滤器将它们管道化。一旦您将数据块从流中分离出来,就用双引号将它们放在一起!
另一个好处可能是在代码高亮编辑器中带有双引号字符串的 bash 脚本具有更好的可读性。