------------ 在一个双引号中直接使用变量名,一般都是没有问题的.它阻止了所有在引号中的特殊字符的 重新解释--包括变量名[2]--但是$,`和\除外.[3]保留$,作为特殊字符的意义,是为了能够在双 引号中也能够正常地引用变量("$var").这样在""中可以使用变量所表达的值(Example 4-1).
使用""来防止单词分割.[4]如果在参数列表中使用双引号,将使得双引号中的参数作为一个参 数.即使双引号中的字符串包含多个单词(也就是包含空白部分),也不会变为多个参数,如: 1 variable1="a variable containing five words" 2 COMMAND This is $variable1 # COMMAND将以7个参数来执行 3 # "This" "is" "a" "variable" "containing" "five" "words" 4 5 COMMAND "This is $variable1" # COMMAND将以1个参数来执行 6 # "This is a variable containing five words" 7 8 9 variable2="" # 空值 10 11 COMMAND $variable2 $variable2 $variable2 # COMMAND将不带参数执行 12 COMMAND "$variable2" "$variable2" "$variable2" # COMMAND将以3个空参数来执行 13 COMMAND "$variable2 $variable2 $variable2" # COMMAND将以1个参数来执行(2空格) 用双引号把参数封到echo中是很有必要的,只有在单词分隔或时保留空白时的时候可能 有些问题.
Example 5-1 echo一些诡异的变量 ################################Start Script####################################### 1 #!/bin/bash 2 # weirdvars.sh: echo诡异的变量 3 4 var="'(]\\{}\$\"" 5 echo $var # '(]\{}$" 6 echo "$var" # '(]\{}$" 并没有什么不同 7 8 echo 9 10 IFS='\' 11 echo $var # '(] {}$" \ 转换成空格了?明显和IFS有关系么!又不傻! 12 echo "$var" # '(]\{}$" 13 14 exit 0 ################################End Script#########################################
单引号操作总体上和""很像,但不允许引用变量.因为$的特殊含义被关闭了.在''中除了',其他 字符都没有特殊的含义了.所以单引号比双引号严格. 因为即使是\,在''中都被关闭了,所以你想在''中显示'的含义,将得不到预期的效果. 1 echo "Why can't I write 's between single quotes" 2 3 echo 4 5 # 一种绕弯的方法 6 echo 'Why can'\''t I write '"'"'s between single quotes' 7 # |-------| |----------| |-----------------------| 8 # 包含了2个单引号字符,原书好像有错误
注意事项: [1] 除非当前目录下,正好有个叫first的文件. [2] 即使是变量的值也是有副作用的(见下边) [3] 如果在""中包含"!"的话,在命令行中将会出现错误.因为这个"!"被当作历史命令来解释了. 在一个脚本中,这种情况是不会发生的,因为在脚本中,Bash历史记录被关闭了.
下边是一些关于"\"一些不协调的行为. bash$ echo hello\! hello!
bash$ echo "hello\!" hello\!
bash$ echo -e x\ty xty
bash$ echo -e "x\ty" x y
[4] "单词分隔",在这个上下文中意味着,将一个字符串分隔为一些分离的参数. |