Mee*_*kat 23 shell bash quoting test variable
假设我们在 bash 脚本中有 2 个整数:
value1=5
value2=3
Run Code Online (Sandbox Code Playgroud)
那么为什么我们需要在测试的情况下使用双引号呢?例如:
if [[ "$value1" -eq "$value2" ]]
Run Code Online (Sandbox Code Playgroud)
为什么不使用以下内容?
if [[ $value1 -eq $value2 ]]
Run Code Online (Sandbox Code Playgroud)
对我来说,双引号没有任何意义。
ter*_*don 35
您实际上并不需要这里的引号。这是使用不带引号的变量是安全的极少数情况之一。您可以通过以下方式确认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!
Run Code Online (Sandbox Code Playgroud)
正如您在上面看到的,测试的引用和未引用版本被 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!
Run Code Online (Sandbox Code Playgroud)
与[ ]
构造不同,该构造[[ ]]
确实需要引用。
一些有用的链接可以了解有关何时以及为何需要引用的更多信息:
jam*_*lin 16
尽管双引号不是必需的,但使用它们的原因是:
value1
和value2
是可变的,您可能不知道它们包含什么。否则你可能会问,“为什么要费心去检查变量而不是检查if [[ 5 -eq 3 ]]
?或者更进一步,if
当你已经知道 5 不等于 3 时,为什么还要费心呢?防守通常更好。(这是真的在[[
中不会发生分词,但不会发生分词的情况很少见。同样,请参见第一点。)分词。
这个例子不太可能,但可能,所以如果你想防御性地编码,用引号覆盖你的踪迹:
$ set -x
$ value1=5
+ value1=5
$ value2=3
+ value2=3
$ [ $value1 -eq $value2 ]
+ '[' 5 -eq 3 ']'
Run Code Online (Sandbox Code Playgroud)
好的,到目前为止一切顺利。让我们把扳手扔进齿轮:
$ IFS=456
+ IFS=456
$ [ $value1 -eq $value2 ]
+ '[' '' -eq 3 ']'
bash: [: : integer expression expected
Run Code Online (Sandbox Code Playgroud)
哎呀。
$ [ "$value1" -eq "$value2" ]
+ '[' 5 -eq 3 ']'
Run Code Online (Sandbox Code Playgroud)
啊。
归档时间: |
|
查看次数: |
2847 次 |
最近记录: |