您的位置:首页 > 运维架构 > Shell

shell 中单引号、双引号的区别

2013-10-20 15:33 357 查看
原文链接:http://blog.sina.com.cn/s/blog_5f5716580100l9k1.html

hard quote:单引号,关闭所有的meta(什么是meta,自己查吧)

soft quote:双引号,关闭大部分的meta,但是某些保留,例如$

这里也提一下escape:反斜杠,它只会关闭紧跟escape之后的字符。

参考cu上经典的十三问,hard quote关闭shell的meta,而soft quote关闭大部分的shell meta,但是$例外,对于bash的来说,命令的解释是从左到右的,首先遇到hard quote和soft quote,所作的解释是不一样,看这个例子:

$ a=1

$ echo "$a"

1               #$被bash解释到

$ echo "'$a'"

'1'                #hard quote被关闭

$ echo '$a'

$a                #$被hard quote关闭

$ echo '"$a"'

"$a"            #所有都被关闭了

如果能够理解上面的了,那基本知道怎么用单引号和双引号了。

而对于awk、ed等等命令,需要区分shell meta和command meta

对于awk来说,它的{ }:是将其内的命令置于non-named function 中执行,awk用{ }来区分命令段,例如BEGIN,END等等。举个例子:

$ awk {print $1} b.txt

awk: line 2: missing } near end of file

看看报错,如果直接使用{ },那么我们知道{ }没有被shell关闭,也就是说它看成shell的meta了,当然报错了,所以要关闭,同时shell中的$也关闭,也就是$需要成为awk的meta了,很好理解吧?如下输出了内容。

awk '{print $1}' b.txt

./0/137/qq/.zhangqx

./0/10/qq/.zyyao

./0/115/qq/.ywt

既然要要关闭{ },那么也可以用soft quote,

awk "{print $0}" b.txt

0

0

0

可以看到,soft quote预期的关闭了{ },但是$还是被shell解释了,这次我们可以用escape,将$关闭了。

$ awk "{print \$0}" b.txt

./0/137/qq/.zhangqx

./0/10/qq/.zyyao

./0/115/qq/.ywt

说到这里,可以大家都一点明白了,并不是awk '{ }' urfile是awk的固定语法,而是为了让awk能够跳脱shell的偷取其命令和参数,看看这个例子就明白了。

$ awk \{print\ \$0\} b.txt

./0/137/qq/.zhangqx

./0/10/qq/.zyyao

所作的一切是为了让awk或者自己的meta,请切记注意print后的空格,也要关闭,要不又被shell解释了。

2. 双引号 ( " " )

双引号作用与单引号类似,区别在于它没有那么严格。单引号告诉shell忽略所有特殊字符,而双引号只要求忽略大多数,具体说,括在双引号中的三种特殊字符不被忽略:$,\,` ,即双引号会解释字符串的特别意思,而单引号直接使用字符串.

3、. 反斜杠 backslash-escaped( \ )

反斜杠一般用作转义字符,或称逃脱字符,linux如果echo要让转义字符发生作用,就要使用-e选项,且转义字符要使用双引号

echo -e "\n"

反斜杠的另一种作用,就是当反斜杠用于一行的最后一个字符时,shell把行尾的反斜杠作为续行,这种结构在分几行输入长命令时经常使用。

BTW

4、$()和``的区别

反引号和$()的功能是命令替换,将反引号或$()中的字符串做为命令来执行,我们在用shell编程时经常用的到 将系统命令的执行结果赋给一个变量

但反引号内不能再引用反引号,而$()中可以引用反引号
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: