将字符串用引号括起来,主要是保护某些特殊字符(如*)不被shell或脚本进上步的解释或扩展。引号分单引号与双引号,两者对字符的保护程度略有差异。
对双引号中的字符串,$和`和\仍有特殊意义,$可用来指明以变量的值代替"$变量名"所在的位置,`则是用命令执行的输出代替,而\则是转义符,\\和\$和\`和\"分别表示\和$和`和"这向个字符。
而单引号中的字符串,除不能出现单引号(因为表示串引用结束)或\外,其它都被保护。此时显示单引号,可采取先结束前面的串,再用双引号显示一个单引号或用\转义一个单引号,后面再用单引号串。如下例
双引号可以保护命令行参数不被shell分拆或压缩参数值内空白。看下面的脚本及其解释。
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脚本而言的,将被保护的串被传给某些命令时,这些命令仍会对某些特殊字符进行扩展或解释。例如:
\n | 换行 |
\r | 回车 |
\t | 一个制表符 |
\v | 垂直制表符 |
\b | 回删 |
\a | 响铃 |
\0xx | 显示xx编码对应的ASCII字符,当将这种串赋给变量时,要在串首引号前加$符号。 |
\" | " |
\$ | $ |
\\ | \ |
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的作用主要表现解析命令行,及变量赋值、表达式计算上,至于其它的则是某个命令特有的功能。用下列做验证