ILD

shell quoting
作者:Yuan Jianpeng 邮箱:785147217@qq.com
发布时间:2020-2-16 站点:Inside Linux Development

metacharacter

如果unquoted,这些字符分开words。它们是:

space tab newline | & ; ( ) < >

Quoting

用来移除某些字符的特殊含义。包含3种quoting机制:escape character, single quotes, double quotes。


Escape Character

一个non-quoted的反斜杠是bash的转义字符,它保留下一个字符的字面值,而表示特殊含义,除了newline这个特殊情况。


如果出现了 \newline,且没有被quoted,\newline被当成一个 line continuation。


1
2
3
4
5
6
7
8
9
$ printarg \ 
args: 1
0(1): sp 
$ printarg \a 
args: 1
0(1): a 
$ printarg \&
args: 1
0(1): &

注意第一行的\后面有个空格。


1
2
3
4
$ printarg \
test
args: 1
0(4): t e s t

可以看到\接换行,表示行连续。


Single Quotes

单引号内的所有内容,保持它们的字面量,单引号里面不能再出现单引号。所有的扩展都无效了。

1
2
3
4
5
6
7
$ printarg '`ls`'
args: 1
0(4): ` l s ` 
$ printarg '\
> '
args: 1
0(2): \ \n

可以看到此时\newline不是表示行连续,其内容包括在结果中。


Double Quotes

除了 $ ` \ 这3个字符,其它所有字符保持字面量。


$和`用来实现shell expansion。\ 后面跟 $ ` " \ newline,用来转义这些字符,其中\newline表示line continuation。\ 后面跟任何其它字符,都不是转义,\ 被普通字母。


1
2
3
4
5
6
7
$ printarg "\a"
args: 1
0(2): \ a 
$ printarg "\
> "
args: 1
0(0):


ANSI-C Quoting

上面的几种方法都不支持c语言中\n \t这种,ANSI-C Quoting就是这种转义。格式:$'string'。

1
2
3
$ printarg $'\t\n'
args: 1
0(2): \t \n


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.