通过echo看shell的单双引号 2022-08-11

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]# 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容