分类:
2008-07-22 13:02:50
shell中的quoting的使用
shell中可以使用的quoting有三种:
(一)使用'\',backslash字符
to remove the special meaning from a single character
A non-quoted backslash ‘\’ is the Bash escape character. It preserves the literal value of the next character that follows, with the exception of newline
. If a \newline
pair appears, and the backslash itself is not quoted, the \newline
is treated as a line continuation (that is, it is removed from the input stream and effectively ignored). 意思看得有点模糊,总之就是用来将后面的字符转义的。
这里援引一个网中人的shell十三问中第4问关于单引号和双引号区别时所用的一个例子来讲述:
$ A=B\
> C\
>
$ echo $A
BC
可见,此时,backslash并没有被quoting,因此它具有quoting功能,但是由于我们在其后面输入的是回车字符,因此回车字符被当作了line continuation,而且backslash和回车都被忽略了。赫赫。
(二)使用''',单引号
to inhibit all interpretation of a sequence of characters.
Enclosing characters in single quotes (‘'’) preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.
就是说单引号可以阻止对它所包含的字符串的任何解释,而且其内部不能再出现'字符,就算用'\'转义不行,echo '\''十一条非法的语句,它提示找不到可以匹配最后一个'的字符。即它将\作为普通字符,将中间的'作为与第一个'匹配的字符,而最后一个'自然就找不到匹配的字符了。
(三)使用'"'双引号
to suppress most of the interpretation of a sequence of characters
Enclosing characters in double quotes (‘"’) preserves the literal value of all characters within the quotes, with the exception of ‘$’, ‘`’, ‘\’, and, when history expansion is enabled, ‘!’. The characters ‘$’ and ‘`’ retain their special meaning within double quotes (see ). The backslash retains its special meaning only when followed by one of the following characters: ‘$’, ‘`’, ‘"’, ‘\’, or newline
. Within double quotes, backslashes that are followed by one of these characters are removed. Backslashes preceding characters without a special meaning are left unmodified. A double quote may be quoted within double quotes by preceding it with a backslash. If enabled, history expansion will be performed unless an ‘!’ appearing in double quotes is escaped using a backslash. The backslash preceding the ‘!’ is not removed.
双引号可以禁止对部分字符的解释,但不能禁止对所有特殊字符的解释。
双引号的使用有些繁琐,有如下规则:
(1) 双引号中,'$' '`' '!'(如果使能了command history功能)是有特殊功能的字符。'\'当其后面紧跟'$' '`' '\' '"' newline时,是有特殊功能的,其功能是转义,且'\'会被remove.
(2) 在双引号中,如果'\'后跟着一个没有特殊含义的字符,'\'和该字符都会被保留,不会被remove
(3) 当command history expansion被开启时,即'!'有作用时,在双引号中,可以用'\'来将'!'转义为普通字符,且'\'被保留不被转义。
下面是一些echo和quoting的例子,=>后面的内容是在脚本中使用set -ex将命令扩展之后的结果:
1.1 echo "\n"
=> echo '\n' ('\'后面跟的不是特殊字符,因此'\'也不具有特殊含义,因此保留原样)
结果输出:\n (2个字符)
1.2 echo -e "\n"
=> echo -e '\n'
结果输出:一个空行 ( -e选项会使ANSI C中的使用backslash的扩展其作用,\n对应的就是换行符,当然还有其它许多,可以info echo来看看)
2.1 echo "\\n"
=>echo '\n' (第一个'\'后跟着一个'\',因此第一个'\'被当作特殊字符,具有转义效果,取后面的'\'字面量,且第一个'\'被remove掉,那么两个'\'的结果就是一个字面量'\',然后跟着一个普通字符n)
输出结果:\n
2.2 echo -e "\\n"
=> echo -e '\n' 原因同2.1
输出结果:一个空行 原因同1.2
3.1 echo "\\\n"
=> echo '\\n' (第一个'\'后跟一个'\',因此第一个被当作有特殊功能字符,它取后面字符的字面量,而且自己被remove,因此前两个'\'的结果就是一个字面量的'\',第3个'\'后面跟着一个普通字符n,因此'\'和'n'都被保留,最终结果为'\\n')
输出结果:\\n
3.2 echo -e "\\\n"
=> echo -e '\\n'
输出结果:\n (没有新行,因为在-e模式下,单引号里,'\'还具有转义效果,第一个'\'将第2个'\'的字面量取出,而且第一个'\'被remove,最后剩下一个'\'字面量,他和普通字符n结合所以结果为\n)
(四)ANSI C格式的转义字符的使用
$'string'格式的使用方法:string会被扩展开,而且如果其中含有如下转义序列的话,会被按照转义序列的含义替换:
\a |
alert (bell) 响铃 | ||
\b |
backspace 回退 | ||
\e |
an escape character 字符 Esc | ||
\f |
form feed 进纸 | ||
\n |
new line 新行符 | ||
\r |
carriage return 回车 | ||
\t |
horizontal tab 水平跳格 | ||
\v |
vertical tab 竖直跳格 | ||
\\ |
backslash 反斜杠 | ||
\’ |
single quote 单引号 |
\xHH |
HH 一个八比特字符,它的值是十六进制值 HH (一到两个十六进制数字)。 |
\cx 一个 ctrl-x 字符 |
扩展结果是单引号引用的,就好像 $ 符号不存在一样。 双引号引用字符串前面加上一个 $ 符号将使得这个字符串被根据当前语言环境 (locale) 来翻译。 如果当前语言环境是 C 或者 POSIX,这个符号将被忽略。 如果这个字符串被翻译并替换了,那么替换结果是双引号引用的。 |