shell的 单双引号、反引号与反斜杠
- 单引号:所见即所得
- 双引号:所见非所得。会先把变量解析之后,再输出
- 反引号(``) :命令替换,通常用于把命令输出结果传给入变量中
- 反斜杠( \ ) :转义字符or逃脱字符,Linux如果echo要让转义字符发生作用,就要使用-e选项,且转义字符要使用双引号
bash脚本的手册里面有更完整的介绍
echo (-E)
按照上面介绍的shell规则,echo使用单引号可以原封不动输出任何字符
但需要注意,这时不能输出内部的单引号,
eg.
[root@VM-165-116-centos tmp]# echo 'my name is 'bob'\n'
my name is bob\n
而我们的预期是输出
my name is 'bob'\n
这说明,echo的内容实际上是 'my name is '+bob+'\n'
,也就是echo认为的单引号对与我们预期的单引号对不一致,echo是就近原则
如果想用 echo 单引 输出内部的单引号,可以
1. 主动截断,把echo的原始内容分割成多部分
利用echo就近配对,我们可以主动截断来完成单引号的输出
[root@VM-165-116-centos tmp]# echo 'my name is '"'"'bob'"'"'\n'
my name is 'bob'\n
echo的内容实际上是 'my name is '+"'"+'bob'+"'"+'\n'
2. 使用echo -e
-e enable interpretation of backslash escapes
-E disable interpretation of backslash escapes (default)
echo 使用-e option可以对待输出内容进行反斜杠转义
于是我们可以使用\x27
替换'
[root@VM-165-116-centos tmp]# echo -e 'my name is \x27bob\x27\n'
my name is 'bob'
[root@VM-165-116-centos tmp]#
单引号的输出符合预期,但是末尾\n被backslash escape了,没有正常输出
因此,echo 使用-e option 对于原始内容带有\的部分需要尤其小心是否会被转义
输出my name is 'bob'\n,需要
[root@VM-165-116-centos tmp]# echo -e 'my name is \x27bob\x27\\n'
my name is 'bob'\n
[root@VM-165-116-centos tmp]#