当前位置: 首页 > 文档资料 > Shell 中文文档 >

5.2. 转义

优质
小牛编辑
120浏览
2023-12-01

转义是引用单字符的方法.在单个字符前面的转义符(\)告诉shell不必特殊解释这个字符,只把它当成字面上的意思。

但在一些命令和软件包里,比如说 echo 和 sed,转义一个字符可能会引起一个相反的效果--因为它们可能触发那个字符的特殊意思。

一些转义字符的表示的特殊意思

和 echo,sed 连用时:

\n

表示新行

\r

表示回车

\t

表示水平的制表符

\v

表示垂直的制表符

\b

表示后退符

\a

表示“警告”(蜂鸣或是闪动)

\0xx

翻译成ASCII码为八进制0xx所表示的字符

例子 5-2. 转义字符

1 #!/bin/bash
   2 # escaped.sh: 转义字符
   3 
   4 echo; echo
   5 
   6 echo "\v\v\v\v"      # 打印出 \v\v\v\v literally。
   7 # 用带着选项-e的'echo'会打印出转义字符串。
   8 echo "============="
   9 echo "VERTICAL TABS"
  10 echo -e "\v\v\v\v"   # 打印四个垂直的制表符。
  11 echo "=============="
  12 
  13 echo "QUOTATION MARK"
  14 echo -e "\042"       # 打印出字符" (引号, 它的八进制ASCII码为42)。
  15 echo "=============="
  16 
  17 # 当使用像

参考扩展结构$' '的另外一个例子xample 34-1.

\"

表示引号(")的字面意思

   1 echo "Hello"                  # Hello
   2 echo "\"Hello\", he said."    # "Hello", he said.

\$

表示美元符($)的字面意思(如果在\$跟上变量名将不会引用变量的值)

   1 echo "\$variable01"  # 输出是$variable01

\\

表示反斜杠(\)的字面意思

   1 echo "\\"  # 输出是\
   2 
   3 # 然而 . . 。
   4 
   5 echo "\"   # 在命令行,这句将会打印SP2变量值(译者注:变量SP2是输入未完成提示符),并要求你继续输入.。
   6            # 在脚本文件里, 这句会出错.

反斜杠的作用要看它是否是自我转义,被引用,或出现在命令替换结构或是在here document里.

   1                       #  简单的转义和引用
   2 echo \z               #  z
   3 echo \\z              # \z
   4 echo '\z'             # \z
   5 echo '\\z'            # \\z
   6 echo "\z"             # \z
   7 echo "\\z"            # \z
   8 
   9                       #  命令替换
  10 echo `echo \z`        #  z
  11 echo `echo \\z`       #  z
  12 echo `echo \\\z`      # \z
  13 echo `echo \\\\z`     # \z
  14 echo `echo \\\\\\z`   # \z
  15 echo `echo \\\\\\\z`  # \\z
  16 echo `echo "\z"`      # \z
  17 echo `echo "\\z"`     # \z
  18 
  19                       # Here document
  20 cat <<EOF              
  21 \z                      
  22 EOF                   # \z
  23 
  24 cat <<EOF              
  25 \\z                     
  26 EOF                   # \z
  27 
  28 # 这些例子由Stéphane Chazelas提供..

一个字符串赋给变量时里面的组成部分可能会被转义,但如果单独一个转义字符(\)是不能赋给变量的。

   1 variable=\
   2 echo "$variable"
   3 # 不能工作 - 给出一个错误信息:
   4 # test.sh: : command not found
   5 # 单独一个转义字符是不能正确地赋给变量的。
   6 #
   7 #  那上面语句究竟发生了什么呢?实际上转义符"\"转义了新行符,
   8 #+ 产生的作用如同       variable=echo "$variable"
   9 #+                      而这是无效的变量赋值
  10 
  11 variable=\
  12 23skidoo
  13 echo "$variable"        #  23skidoo
  14                         #  这样就能工作,因为第二行的变量赋值是有效的
  15                         #
  16 
  17 variable=\ 
  18 #        \^    转义后面的空格(译者注:粗心的读者一定要注意上面最后的空格)
  19 echo "$variable"        # 空格
  20 
  21 variable=\\
  22 echo "$variable"        # \
  23 
  24 variable=\\\
  25 echo "$variable"
  26 # 不能工作 - 产生一个错误:
  27 # test.sh: \: command not found
  28 #
  29 #  第一个\转义第二个\,结果只剩单独的第三个\字符,
  30 #+ 这样又会发生上面的情况。
  31 
  32 variable=\\\\
  33 echo "$variable"        # \\
  34                         # 第二和第四个\字符被转义。
  35                         # 这样不会出错了.

转义一个空格可以防止一个字符串参数被分割成多个命令行参数。

   1 file_list="/bin/cat /bin/gzip /bin/more /usr/bin/less /usr/bin/emacs-20.7"
   2 # 文件列表作为参数传递给命令。
   3 
   4 # 再加两个参数给命令ls,一同列出文件信息。
   5 ls -l /usr/X11R6/bin/xsetroot /sbin/dump $file_list
   6 
   7 echo "-------------------------------------------------------------------------"
   8 
   9 # 如果我们转义上面的一对空格会发生什么?
  10 ls -l /usr/X11R6/bin/xsetroot\ /sbin/dump\ $file_list
  11 # 出错: 开头的三个文件名被连成一个文件名并传递给了命令'ls -l'
  12 #        因为两个转义字符禁止了空格分割参数的作用。

转义符也提供了写一个多行命令的手段。一般地,每个单独的行有一个不同的命令,而在一行末尾的转义符转义新行符,命令序列则由下一行继续。

   1 (cd /source/directory && tar cf - . ) | \
   2 (cd /dest/directory && tar xpvf -)
   3 # 把Alan Cox目录树全部复制到另外一个目录里,
   4 # 但分为两行可以增加可读性。
   5 
   6 # 你也可以用下面的命令达到一样的效果:
   7 tar cf - -C /source/directory . |
   8 tar xpvf - -C /dest/directory
   9 # 看看下面的注释。
  10 # (多谢,Stéphane Chazelas.)

如果一个脚本行用一个管道线"|"结束行尾,后面可以再跟一个不必一定要的转义符"\"。然而,好的编程习惯最好加上一个转义符“\”。

   1 echo "foo
   2 bar" 
   3 #foo
   4 #bar
   5 
   6 echo
   7 
   8 echo 'foo
   9 bar'    # 没什么不同。
  10 #foo
  11 #bar
  12 
  13 echo
  14 
  15 echo foo\
  16 bar     # 新行符被转义。
  17 #foobar
  18 
  19 echo
  20 
  21 echo "foo\
  22 bar"     # 还是一样,字符\在弱引用中还是被解释为转义字符
  23 #foobar
  24 
  25 echo
  26 
  27 echo 'foo\
  28 bar'     # 由于转义符"\"在强引用符里,所以只能解释为字面上的意思
  29 #foo\
  30 #bar
  31 
  32 # 由Stéphane Chazelas提示写成的例子.
\X' 的结构时,-e 选项是多余的。 18 echo; echo "NEWLINE AND BEEP" 19 echo

参考扩展结构$' '的另外一个例子xample 34-1.

\"

表示引号(")的字面意思

 

\$

表示美元符($)的字面意思(如果在\$跟上变量名将不会引用变量的值)

 

\\

表示反斜杠(\)的字面意思

 

反斜杠的作用要看它是否是自我转义,被引用,或出现在命令替换结构或是在here document里.

 

一个字符串赋给变量时里面的组成部分可能会被转义,但如果单独一个转义字符(\)是不能赋给变量的。

 

转义一个空格可以防止一个字符串参数被分割成多个命令行参数。

 

转义符也提供了写一个多行命令的手段。一般地,每个单独的行有一个不同的命令,而在一行末尾的转义符转义新行符,命令序列则由下一行继续。

 

如果一个脚本行用一个管道线"|"结束行尾,后面可以再跟一个不必一定要的转义符"\"。然而,好的编程习惯最好加上一个转义符“\”。

 
\n' # 新行。 20 echo

参考扩展结构$' '的另外一个例子xample 34-1.

\"

表示引号(")的字面意思

 

\$

表示美元符($)的字面意思(如果在\$跟上变量名将不会引用变量的值)

 

\\

表示反斜杠(\)的字面意思

 

反斜杠的作用要看它是否是自我转义,被引用,或出现在命令替换结构或是在here document里.

 

一个字符串赋给变量时里面的组成部分可能会被转义,但如果单独一个转义字符(\)是不能赋给变量的。

 

转义一个空格可以防止一个字符串参数被分割成多个命令行参数。

 

转义符也提供了写一个多行命令的手段。一般地,每个单独的行有一个不同的命令,而在一行末尾的转义符转义新行符,命令序列则由下一行继续。

 

如果一个脚本行用一个管道线"|"结束行尾,后面可以再跟一个不必一定要的转义符"\"。然而,好的编程习惯最好加上一个转义符“\”。

 
\a' # 警告 (蜂鸣)。 21  22 echo "===============" 23 echo "QUOTATION MARKS" 24 # 版本2开始Bash已经允许使用

参考扩展结构$' '的另外一个例子xample 34-1.

\"

表示引号(")的字面意思

 

\$

表示美元符($)的字面意思(如果在\$跟上变量名将不会引用变量的值)

 

\\

表示反斜杠(\)的字面意思

 

反斜杠的作用要看它是否是自我转义,被引用,或出现在命令替换结构或是在here document里.

 

一个字符串赋给变量时里面的组成部分可能会被转义,但如果单独一个转义字符(\)是不能赋给变量的。

 

转义一个空格可以防止一个字符串参数被分割成多个命令行参数。

 

转义符也提供了写一个多行命令的手段。一般地,每个单独的行有一个不同的命令,而在一行末尾的转义符转义新行符,命令序列则由下一行继续。

 

如果一个脚本行用一个管道线"|"结束行尾,后面可以再跟一个不必一定要的转义符"\"。然而,好的编程习惯最好加上一个转义符“\”。

 
\nnn'结构了。 25 # 注意在这里,'\nnn'表示一个八进制的值。 26 echo

参考扩展结构$' '的另外一个例子xample 34-1.

\"

表示引号(")的字面意思

 

\$

表示美元符($)的字面意思(如果在\$跟上变量名将不会引用变量的值)

 

\\

表示反斜杠(\)的字面意思

 

反斜杠的作用要看它是否是自我转义,被引用,或出现在命令替换结构或是在here document里.

 

一个字符串赋给变量时里面的组成部分可能会被转义,但如果单独一个转义字符(\)是不能赋给变量的。

 

转义一个空格可以防止一个字符串参数被分割成多个命令行参数。

 

转义符也提供了写一个多行命令的手段。一般地,每个单独的行有一个不同的命令,而在一行末尾的转义符转义新行符,命令序列则由下一行继续。

 

如果一个脚本行用一个管道线"|"结束行尾,后面可以再跟一个不必一定要的转义符"\"。然而,好的编程习惯最好加上一个转义符“\”。

 
\t \042 \t' # Quote (") framed by tabs。 27  28 # 使用

参考扩展结构$' '的另外一个例子xample 34-1.

\"

表示引号(")的字面意思

 

\$

表示美元符($)的字面意思(如果在\$跟上变量名将不会引用变量的值)

 

\\

表示反斜杠(\)的字面意思

 

反斜杠的作用要看它是否是自我转义,被引用,或出现在命令替换结构或是在here document里.

 

一个字符串赋给变量时里面的组成部分可能会被转义,但如果单独一个转义字符(\)是不能赋给变量的。

 

转义一个空格可以防止一个字符串参数被分割成多个命令行参数。

 

转义符也提供了写一个多行命令的手段。一般地,每个单独的行有一个不同的命令,而在一行末尾的转义符转义新行符,命令序列则由下一行继续。

 

如果一个脚本行用一个管道线"|"结束行尾,后面可以再跟一个不必一定要的转义符"\"。然而,好的编程习惯最好加上一个转义符“\”。

 
\xhhh'结构也可以使用十六进制数来转义。 29 echo

参考扩展结构$' '的另外一个例子xample 34-1.

\"

表示引号(")的字面意思

 

\$

表示美元符($)的字面意思(如果在\$跟上变量名将不会引用变量的值)

 

\\

表示反斜杠(\)的字面意思

 

反斜杠的作用要看它是否是自我转义,被引用,或出现在命令替换结构或是在here document里.

 

一个字符串赋给变量时里面的组成部分可能会被转义,但如果单独一个转义字符(\)是不能赋给变量的。

 

转义一个空格可以防止一个字符串参数被分割成多个命令行参数。

 

转义符也提供了写一个多行命令的手段。一般地,每个单独的行有一个不同的命令,而在一行末尾的转义符转义新行符,命令序列则由下一行继续。

 

如果一个脚本行用一个管道线"|"结束行尾,后面可以再跟一个不必一定要的转义符"\"。然而,好的编程习惯最好加上一个转义符“\”。

 
\t \x22 \t' # Quote (") framed by tabs。 30 # 多谢Greg Keraunen指出这个.。 31 # 早期的Bash版本允许用'\x022'.(译者注,现在不行了) 32 echo "===============" 33 echo 34  35  36 # 用ASCII码值把字符赋给变量。 37 # ---------------------------------------- 38 quote=

参考扩展结构$' '的另外一个例子xample 34-1.

\"

表示引号(")的字面意思

 

\$

表示美元符($)的字面意思(如果在\$跟上变量名将不会引用变量的值)

 

\\

表示反斜杠(\)的字面意思

 

反斜杠的作用要看它是否是自我转义,被引用,或出现在命令替换结构或是在here document里.

 

一个字符串赋给变量时里面的组成部分可能会被转义,但如果单独一个转义字符(\)是不能赋给变量的。

 

转义一个空格可以防止一个字符串参数被分割成多个命令行参数。

 

转义符也提供了写一个多行命令的手段。一般地,每个单独的行有一个不同的命令,而在一行末尾的转义符转义新行符,命令序列则由下一行继续。

 

如果一个脚本行用一个管道线"|"结束行尾,后面可以再跟一个不必一定要的转义符"\"。然而,好的编程习惯最好加上一个转义符“\”。

 
\042' # 引号"被赋给变量quote了。 39 echo "$quote This is a quoted string, $quote and this lies outside the quotes." 40  41 echo 42  43 # 用连串的ASCII码把一串字符赋给变量.。 44 triple_underline=

参考扩展结构$' '的另外一个例子xample 34-1.

\"

表示引号(")的字面意思

 

\$

表示美元符($)的字面意思(如果在\$跟上变量名将不会引用变量的值)

 

\\

表示反斜杠(\)的字面意思

 

反斜杠的作用要看它是否是自我转义,被引用,或出现在命令替换结构或是在here document里.

 

一个字符串赋给变量时里面的组成部分可能会被转义,但如果单独一个转义字符(\)是不能赋给变量的。

 

转义一个空格可以防止一个字符串参数被分割成多个命令行参数。

 

转义符也提供了写一个多行命令的手段。一般地,每个单独的行有一个不同的命令,而在一行末尾的转义符转义新行符,命令序列则由下一行继续。

 

如果一个脚本行用一个管道线"|"结束行尾,后面可以再跟一个不必一定要的转义符"\"。然而,好的编程习惯最好加上一个转义符“\”。

 
\137\137\137' # 137是字符'_'的ASCII码。 45 echo "$triple_underline UNDERLINE $triple_underline" 46  47 echo 48  49 ABC=

参考扩展结构$' '的另外一个例子xample 34-1.

\"

表示引号(")的字面意思

 

\$

表示美元符($)的字面意思(如果在\$跟上变量名将不会引用变量的值)

 

\\

表示反斜杠(\)的字面意思

 

反斜杠的作用要看它是否是自我转义,被引用,或出现在命令替换结构或是在here document里.

 

一个字符串赋给变量时里面的组成部分可能会被转义,但如果单独一个转义字符(\)是不能赋给变量的。

 

转义一个空格可以防止一个字符串参数被分割成多个命令行参数。

 

转义符也提供了写一个多行命令的手段。一般地,每个单独的行有一个不同的命令,而在一行末尾的转义符转义新行符,命令序列则由下一行继续。

 

如果一个脚本行用一个管道线"|"结束行尾,后面可以再跟一个不必一定要的转义符"\"。然而,好的编程习惯最好加上一个转义符“\”。

 
\101\102\103\010' # 101, 102, 103分别是A, B, C字符的八进制ASCII码。 50 echo $ABC 51  52 echo; echo 53  54 escape=

参考扩展结构$' '的另外一个例子xample 34-1.

\"

表示引号(")的字面意思

 

\$

表示美元符($)的字面意思(如果在\$跟上变量名将不会引用变量的值)

 

\\

表示反斜杠(\)的字面意思

 

反斜杠的作用要看它是否是自我转义,被引用,或出现在命令替换结构或是在here document里.

 

一个字符串赋给变量时里面的组成部分可能会被转义,但如果单独一个转义字符(\)是不能赋给变量的。

 

转义一个空格可以防止一个字符串参数被分割成多个命令行参数。

 

转义符也提供了写一个多行命令的手段。一般地,每个单独的行有一个不同的命令,而在一行末尾的转义符转义新行符,命令序列则由下一行继续。

 

如果一个脚本行用一个管道线"|"结束行尾,后面可以再跟一个不必一定要的转义符"\"。然而,好的编程习惯最好加上一个转义符“\”。

 
\033' # 033是ESC的ASCII码的八进制值 55 echo "\"escape\" echoes as $escape" 56 # 不可见的输出。 57  58 echo; echo 59  60 exit 0

参考扩展结构$' '的另外一个例子xample 34-1.

\"

表示引号(")的字面意思

 

\$

表示美元符($)的字面意思(如果在\$跟上变量名将不会引用变量的值)

 

\\

表示反斜杠(\)的字面意思

 

反斜杠的作用要看它是否是自我转义,被引用,或出现在命令替换结构或是在here document里.

 

一个字符串赋给变量时里面的组成部分可能会被转义,但如果单独一个转义字符(\)是不能赋给变量的。

 

转义一个空格可以防止一个字符串参数被分割成多个命令行参数。

 

转义符也提供了写一个多行命令的手段。一般地,每个单独的行有一个不同的命令,而在一行末尾的转义符转义新行符,命令序列则由下一行继续。

 

如果一个脚本行用一个管道线"|"结束行尾,后面可以再跟一个不必一定要的转义符"\"。然而,好的编程习惯最好加上一个转义符“\”。