FROM : http://hedong.3322.org/archives/000259.html
引用,用引号“括”起来的字符串。
将字符串用引号括起来,主要是保护某些特殊字符(如*)不被shell或脚本进上步的解释或扩展。引号分单引号与双引号,两者对字符的保护程度略有差异。
对双引号中的字符串,$和`和\仍有特殊意义,$可用来指明以变量的值代替"$变量名"所在的位置,`则是用命令执行的输出代替,而\则是转义符,\\和\$和\`和\"分别表示\和$和`和"这向个字符。
而单引号中的字符串,除不能出现单引号(因为表示串引用结束)或\外,其它都被保护。此时显示单引号,可采取先结束前面的串,再用双引号显示一个单引号或用\转义一个单引号,后面再用单引号串。如下例
Why can't I write 's between single quotes
双引号可以保护命令行参数不被shell分拆或压缩参数值内空白。看下面的脚本及其解释。
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).
需要指出的是,上面提到的引用保护功能,只是对shell或shell脚本而言的,将被保护的串被传给某些命令时,这些命令仍会对某些特殊字符进行扩展或解释。例如:
file1.txt:This is the first line of file1.txt.
file2.txt:This is the First line of file2.txt.
最典型的是echo和sed命令(加参数-e),会对很多的特殊字符自行重新解释或扩展,列表如下:
\n | 换行 |
\r | 回车 |
\t | 一个制表符 |
\v | 垂直制表符 |
\b | 回删 |
\a | 响铃 |
\0xx | 显示xx编码对应的ASCII字符,当将这种串赋给变量时,要在串首引号前加$符号。 |
\" | " |
\$ | $ |
\\ | \ |
说明,当\后面的字符不是上述字符时,则如果不在串中,则shell会将那个\去掉后传给echo或sed,如果是在串中(无论单或双引号),则\被传给命令。例如:
echo \\z # \z
echo '\z' # \z
echo '\\z' # \\z
echo "\z" # \z
echo "\\z" # \z
echo "\v\v\v\v" # Prints \v\v\v\v literally.
# Use the -e option with 'echo' to print escaped characters.
echo -e "\v\v\v\v" # Prints 4 vertical tabs.
另外,在命令行中,\后加一个空格,会禁止shell根据此空格将串区分不同的参数,这对表达文字名字中含有空格的情况非常有用。
再外,\在命令行或脚本中一行的最后时,起到将两行的内容连在一起作用,这对长的命令行输入有帮助。
看到这儿,晕了没?:)
我觉得,要把握对串及转义符的理解,关键在于明了:shell的作用主要表现解析命令行,及变量赋值、表达式计算上,至于其它的则是某个命令特有的功能。用下列做验证
bash$ echo "hello\!"
bash$ echo -e x\ty
bash$ echo -e "x\ty"
它们的执行结果分别是什么?好好想想!
hello! y
按住鼠标左键,在上面空白处拖动就看到了。结果一样吗?