引用,用引号“括”起来的字符串。
将字符串用引号括起来,主要是保护某些特殊字符(如*)不被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!
hello/!
xty
x y
按住鼠标左键,在上面空白处拖动就看到了。结果一样吗?