在 Bash 中,单引号 ('') 和双引号 (\'\') 有什么区别?
) 和双引号 ( ''
) ""
有什么区别
由于这是处理 Bash 中的引号时事实上的答案,因此在处理 shell 中的算术运算符时,我将补充上述答案中遗漏的一点。
Bash shell 支持两种方式进行算术运算,一种由内置 let
命令定义,另一种由 $((..))
运算符定义。前者计算算术表达式,而后者更像是复合语句。
重要的是要理解,使用的算术表达式 let
会像任何其他 shell 命令一样进行分词、路径名扩展。因此需要进行适当的引用和转义。
使用时请参见此示例 let
:
let 'foo = 2 + 1'
echo $foo
3
在这里使用单引号是完全没问题的,因为这里不需要变量扩展。考虑以下情况
bar=1
let 'foo = $bar + 1'
它会失败,因为 $bar
下面的单引号不会 扩展 ,需要用双引号引起来
let 'foo = '"$bar"' + 1'
这应该是原因之一,应该 $((..))
始终考虑使用 而不是使用 let
。因为在它里面,内容不受分词的影响。前面的示例使用 let
可以简单地写成
(( bar=1, foo = bar + 1 ))
$((..))
单引号
虽然 $((..))
可以使用双引号,但这样做没有任何用处,因为它 不能 包含需要双引号的内容。只需确保它不是单引号即可。
printf '%d\n' '$((1+1))'
-bash: printf: $((1+1)): invalid number
printf '%d\n' $((1+1))
2
printf '%d\n' "$((1+1))"
2
也许在单引号字符串中使用运算符的某些特殊情况下 $((..))
,您需要以一种方式插入引号,即运算符要么不加引号,要么放在双引号中。例如,考虑这样一种情况,当您试图在语句中使用运算符 curl
来在每次发出请求时传递计数器时,请执行
curl http://myurl.com --data-binary '{"requestCounter":'"$((reqcnt++))"'}'
注意里面嵌套双引号的使用,如果没有双引号,文字字符串 $((reqcnt++))
就会传递给 requestCounter
字段。