linux 脚本转义字符,shell之转义字符

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 # 当使用像$'\X'的结构时,-e选项是多余的.

18 echo; echo "NEWLINE AND BEEP"

19 echo $'\n' # 新行.

20 echo $'\a' # 警告 (蜂鸣).

21

22 echo "==============="

23 echo "QUOTATION MARKS"

24 # 版本2开始Bash已经允许使用$'\nnn'结构了.

25 # 注意在这里,'\nnn'表示一个八进制的值.

26 echo $'\t \042 \t' # Quote (") framed by tabs.

27

28 # 使用$'\xhhh'结构也可以使用十六进制数来转义.

29 echo $'\t \x22 \t' # Quote (") framed by tabs.

30 # 多谢Greg Keraunen指出这个..

31 # 早期的Bash版本允许用'\x022'.(译者注,现在不行了)

32 echo "==============="

33 echo

34

35

36 # 用ASCII码值把字符赋给变量.

37 # ----------------------------------------

38 quote=$'\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=$'\137\137\137' # 137是字符'_'的ASCII码.

45 echo "$triple_underline UNDERLINE $triple_underline"

46

47 echo

48

49 ABC=$'\101\102\103\010' # 101, 102, 103分别是A, B, C字符的八进制ASCII码.

50 echo $ABC

51

52 echo; echo

53

54 escape=$'\033' # 033是ESC的ASCII码的八进制值

55 echo "\"escape\" echoes as $escape"

56 # 不可见的输出.

57

58 echo; echo

59

60 exit 0\"表示引号(")的字面意思

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  # 在脚本文件里, 这句会出错.

31468059_1.png

反斜杠的作用要看它是否是自我转义,被引用,或出现在命令替换结构或是在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 <

21 \z

22 EOF # \z

23

24 cat <

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

31468059_1.png

如果一个脚本行用一个管道线"|"结束行尾,后面可以再跟一个不必一定要的转义符"\"。然而,好的编程习惯最好加上一个转义符“\”。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提示写成的例子.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值