bash编程学习笔记(4)

FROM : http://hedong.3322.org/archives/000259.html


引用,用引号“括”起来的字符串。

  将字符串用引号括起来,主要是保护某些特殊字符(如*)不被shell或脚本进上步的解释或扩展。引号分单引号与双引号,两者对字符的保护程度略有差异。
  对双引号中的字符串,$和`和\仍有特殊意义,$可用来指明以变量的值代替"$变量名"所在的位置,`则是用命令执行的输出代替,而\则是转义符,\\和\$和\`和\"分别表示\和$和`和"这向个字符。
  而单引号中的字符串,除不能出现单引号(因为表示串引用结束)或\外,其它都被保护。此时显示单引号,可采取先结束前面的串,再用双引号显示一个单引号或用\转义一个单引号,后面再用单引号串。如下例

$echo 'Why can'\''t I write '"'"'s between single quotes'
Why can't I write 's between single quotes

  双引号可以保护命令行参数不被shell分拆或压缩参数值内空白。看下面的脚本及其解释。

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).

  需要指出的是,上面提到的引用保护功能,只是对shell或shell脚本而言的,将被保护的串被传给某些命令时,这些命令仍会对某些特殊字符进行扩展或解释。例如:

bash$ grep '[Ff]irst' *.txt
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 "\\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 "hello\!"
bash$ echo -e x\ty
bash$ echo -e "x\ty"

它们的执行结果分别是什么?好好想想!
hello!  y
按住鼠标左键,在上面空白处拖动就看到了。结果一样吗?

你可能感兴趣的:(bash)