当引用变量时,通常建议将其名称用双引号括起来。这可以防止对引号字符串中所有特殊字符的重新解释 -- 除了 $、` (反引号) 和 \ (转义符)。 [1] 在双引号内保留 $ 作为特殊字符允许引用带引号的变量 ("$variable"),也就是说,将变量替换为其值 (参见上面的 示例 4-1)。
使用双引号来防止单词分割。[2] 即使参数包含空白分隔符,用双引号括起来的参数也会被视为一个单词。
List="one two three" for a in $List # Splits the variable in parts at whitespace. do echo "$a" done # one # two # three echo "---" for a in "$List" # Preserves whitespace in a single variable. do # ^ ^ echo "$a" done # one two three |
一个更详细的例子
variable1="a variable containing five words" COMMAND This is $variable1 # Executes COMMAND with 7 arguments: # "This" "is" "a" "variable" "containing" "five" "words" COMMAND "This is $variable1" # Executes COMMAND with 1 argument: # "This is a variable containing five words" variable2="" # Empty. COMMAND $variable2 $variable2 $variable2 # Executes COMMAND with no arguments. COMMAND "$variable2" "$variable2" "$variable2" # Executes COMMAND with 3 empty arguments. COMMAND "$variable2 $variable2 $variable2" # Executes COMMAND with 1 argument (2 spaces). # Thanks, St�phane Chazelas. |
![]() | 只有当单词分割或保留空白成为问题时,才需要将 echo 语句的参数用双引号括起来。 |
示例 5-1. 回显奇怪的变量
#!/bin/bash # weirdvars.sh: Echoing weird variables. echo var="'(]\\{}\$\"" echo $var # '(]\{}$" echo "$var" # '(]\{}$" Doesn't make a difference. echo IFS='\' echo $var # '(] {}$" \ converted to space. Why? echo "$var" # '(]\{}$" # Examples above supplied by Stephane Chazelas. echo var2="\\\\\"" echo $var2 # " echo "$var2" # \\" echo # But ... var2="\\\\"" is illegal. Why? var3='\\\\' echo "$var3" # \\\\ # Strong quoting works, though. # ************************************************************ # # As the first example above shows, nesting quotes is permitted. echo "$(echo '"')" # " # ^ ^ # At times this comes in useful. var1="Two bits" echo "\$var1 = "$var1"" # $var1 = Two bits # ^ ^ # Or, as Chris Hiestand points out ... if [[ "$(du "$My_File1")" -gt "$(du "$My_File2")" ]] # ^ ^ ^ ^ ^ ^ ^ ^ then ... fi # ************************************************************ # |
单引号 (' ') 的操作类似于双引号,但不允许引用变量,因为 $ 的特殊含义被关闭了。在单引号内,除了 ' 之外的每个特殊字符都会被字面解释。可以将单引号 ("完全引用") 视为比双引号 ("部分引用") 更严格的引用方法。
![]() | 由于即使是转义字符 (\) 在单引号内也会被字面解释,因此尝试在单引号内包含单引号将不会产生预期的结果。
|
[1] | 当从命令行使用时,将 "!" 封装在双引号中会产生错误。这被解释为一个 历史命令。但是,在脚本中,这个问题不会发生,因为 Bash 历史机制在此时被禁用。 更令人关注的是以下内容的表面上不一致的行为\在双引号内,尤其是在 echo -e 命令之后。
在 echo 之后的双引号有时会转义\。-eecho 的选项会导致 "\t" 被解释为 制表符。 (感谢 Wayne Pollock 指出这一点,以及 Geoff Lee 和 Daniel Barclay 对此的解释。) | |
[2] |