设为首页 收藏本站
查看: 860|回复: 0

shell编程中的单引号和双引号的使用

[复制链接]

尚未签到

发表于 2018-8-29 09:53:27 | 显示全部楼层 |阅读模式
Shell编程 Bash引号的那点事
  投稿:mdxy-dxy
  促使我想写这个系列的文章,是因为看到总有人提到相同的问题,犯相同的错误,曾经我也是这么过来的,不忍心看到后面还有人经常这么曲折的过来
  先了解下,在bash脚本中,有三种引号
  1. 单引号 '
  2. 双引号 "
  3. 反引号 `
  单引号
  两个单引号包围起来的字符串就是普通的字符串,它将保留原始的字面意思.
  双引号
  两个双引号包围起来的字符串,部分特殊字符将起到它们的作用.
  这些特殊字符有: 美元符$, 反斜杠\, 反引号,  感叹号!.
  反引号
  两个反引号包围起来的字符串,将作为命令来运行,
  执行的输出结果作为该反引号的内容,称为命令替换,
  它有另一种更好的写法: $(command)
  我们来看几个例子,更直接的了解这三种引号的特性.
  1. 美元符$在单、双引号中的表现: 在双引号中的$, 将发生变量引用, 而在单引号中的$, 将保留它的字面意思
  igi@gentoo ~ $ echo '$HOME'
  $HOME
  igi@gentoo ~ $ echo "$HOME"
  /home/igi
  注: HOME为内部变量
  2. 反斜杠\ 在单、双引号中的表现: 在双引号中的\, 将转义它后面的字符,使其具有特殊意义或者失去原来的特殊意义, 在单引号中的\, 将保留它的字面意思
  igi@gentoo ~ $ echo '\$HOME'
  \$HOME
  igi@gentoo ~ $ echo "\$HOME"
  $HOME
  注: 双引号中的\,后面跟着$, 这里发生了转义,使得$失去特殊意义, 变成普通字符.
  3. 反引号与其他两种引号的不同: 反引号包围起来的字符串将被运行,取其结果
  igi@gentoo ~ $ echo 'date'
  date
  igi@gentoo ~ $ echo "date"
  date
  igi@gentoo ~ $ echo `date`
  Fri Dec 3 18:34:09 CST 2010
  注: 在反引号中的date被当成命令执行,包含的正是命令的输出信息
  了解了他们的不同,我们来聊一聊常见的问题
  1. 把反引号` 写 成单引号'
  不得不说,它们长得确实很像,个别书的印刷字体区别度不高或者印刷质量不过关, 导致了很多新手认错,常把反引号`写成单引号'。如果你不知道反引号在哪,请看看Esc键下面的那个按键, 那个就是反引号。当然也不排除有些人看书不注意,这也是常有的事。只要我们明白了反引号与单引号作用的区别,什么时候要用单引号,什么时候要用反引号就一 清二楚了。当你需要一个字符串时,使用单引号; 而当你需要捕捉命令的输出时,请用反引号。
  2. 总是忘了加双引号
  双引号不总是多余的,被它包围的数据变得很安全,不至于被bash切开对待。
  igi@gentoo ~ $ seq 3
  1
  2
  3
  igi@gentoo ~ $ echo `seq 3`
  1 2 3
  igi@gentoo ~ $ echo "`seq 3`"
  1
  2
  3
  注: seq输出的是包含换行的信息,但echo `seq 3` 却丢失了换行符,因为bash在解析时认为`seq 3`的输出结果是3个独立的字符,解析后与echo 1 2 3相同(这个过程,bash做了很多工作,有兴趣的可以了解下bash解析顺序); 而echo “`seq 3`”时,bash把`seq 3`的输出结果当成一个整体对待(因为它被双引号包围),所以输出的结果不会被bash拆分对待,换行符得以保留。所以,当你需要保留变量或者命令替换的 完整信息, 特别是换行符时,请记得给它们戴上双引号作保险,时刻加个双引号是个好习惯(为什么不是单引号呢?前面解释了,单引号里面没有魔法,变量也变不了了,命令 替换也替换不了了)。再次提醒: “$var”, “`command`”, 都比$var, `command`安全得多,很多情况下,前面的才是你要的结果,除非你知道你在做什么,否则不要轻易省略双引号。
  3. 引号嵌套总是混乱的
  引号中包含其他引号,只要能理解单引号和双引号中字符的表现,就不难掌握
  igi@gentoo ~ $ echo "abc\"abc"
  abc"abc
  igi@gentoo ~ $ echo "abc\'abc"
  abc'abc
  igi@gentoo ~ $ echo "abc\`abc"
  abc`abc
  如你所见,双引号中加入其他引号很容易,你只需要用反斜杠\转义你要添加的引号(双引号中加单引号可以不用转义)。 那么单引号中是否如此简单?
  igi@gentoo ~ $ echo 'abc"abc'
  abc"abc
  igi@gentoo ~ $ echo 'abc`abc'
  abc`abc
  到这里,确实很简单,单引号中都是普通字符,所以完全不需要转义,如果加了反斜杠\, 那么反斜杠依然是它自己,直接打印出来。
  igi@gentoo ~ $ echo 'abc\"\`abc'
  abc\"\`abc
  问题来了,单引号中如何包含单引号?这个时候,反斜杠\也是无用的, 如果直接写单引号,那么bash会认为引号还没结束。好吧,如果你不幸碰到这样的问题,还是有办法解决的
  igi@gentoo ~ $ echo $'abc\'abc'
  abc'abc
  igi@gentoo ~ $ echo -e 'abc\x27abc'
  abc'abc
  igi@gentoo ~ $ echo 'abc'\''abc'
  abc'abc
  第一种方法是bash特有的,$'string' 之间到反斜杠都将转义字符,第二种方法,通过单引号的ASCII码来打印单引号,而第三种方法,则是通过截断命令,在中间插入单引号来实现。一般用第一种方法是最优雅的。
  最后: 希望能更多的人喜欢Bash,使用Bash。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-558028-1-1.html 上篇帖子: 02_shell_basic 01_prepare 下篇帖子: Linux shell扩展用法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表