shell中单引号和双引号的区别-经典解释

最简短解释

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

  2. soft quote:双引号,关闭大部分的meta,但是某些保留,括在双引号中的三种特殊字符不被忽略:$,\,`

  3. escape:反斜杠,它只会关闭紧跟escape之后的字符。

进一步解释

双引号 ( " " )

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

反斜杠 backslash-escaped( )

反斜杠一般用作转义字符,或称逃脱字符,linux如果echo要让转义字符发生作用,就要使用-e选项,且转义字符要使用双引号
echo -e “n”
反斜杠的另一种作用,就是当反斜杠用于一行的最后一个字符时,shell把行尾的反斜杠作为续行,这种结构在分几行输入长命令时经常使用。
BTW

$()和``的区别

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

举例

参考cu上经典的十三问,hard quote关闭shell的meta,而soft quote关闭大部分的shell meta,但是$例外,对于bash的来说,命令的解释是从左到右的,首先遇到hard quote和soft quote,所作的解释是不一样,看这个例子:
$ a=1
$ echo "KaTeX parse error: Expected 'EOF', got '#' at position 21: … #̲被bash解释到
$ echo “’$a’”
‘1’ #hard quote被关闭
$ echo ‘$a’
KaTeX parse error: Expected 'EOF', got '#' at position 18: … #̲被hard quote关闭
$ echo '“ a " " 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 KaTeX parse error: Expected 'EOF', got '}' at position 2: 0}̲" b.txt 0 0 0 可…还是被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解释了。

猜你喜欢

转载自blog.csdn.net/weixin_42657120/article/details/88627579