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

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。

shell脚本:2_单引号和双引号 - 腾讯云开发者社区-腾讯云终于知道 Shell 中单引号双引号的区别了-51CTO.COMShell脚本中单引号(‘)和双引号(“)的使用区别 - html中文网shell编程基础 单引号和双引号的区别 - html中文网linux shell单引号、双引号及无引号区别_憂零的技术博客 ...shell字符串单双引号的坑 - 腾讯云开发者社区-腾讯云shell中单引号,双引号,反引号,不用引号的使用区别 ...Shell 2. 单引号、双引号、反引号的区别 - 简书linux bash shell 中的单引号和双引号-pudn.comshell脚本中单引号和双引号shell基础知识-echo及单引号、反引号和双引号详解【转】shell的反引号、单引号双引号的作用Shell脚本中单引号(‘)和双引号(“)的使用区别SHELL脚本中单引号和双引号的区别Linux shell中单引号,双引号及不加引号的简单区别shell 脚本中双引号单引号、反引号的区别shell中单引号,双引号,反引号,转义字符shell中单引号、双引号、飘号区别Linux Shell 之引号(单引号双引号;反引号)Jenkins pipeline单引号双引号和转义字符linux shell单引号双引号及无引号区别 【转】【linux】shell脚本echo中单引号和双引号的区别关于sql:何时在MySQL中使用单引号双引号和反引号如何理解shell中的双引号和单引号嵌套时的工作原理?shell反引号,单引号,双引号awk 打印单引号和双引号Shell中单引号和双引号区别shell编程(二):单引号双引号反引号shell 变量保护 引号的作用Shell-Sed 单引号双引号同时替换shell脚本中单引号和双引号的区别Shell 编程中单双引号异同sed -i 单引号中嵌套双引号_【linux】Shell 单引号'' 双引号"" 反引号`` $()的区别...【python】sql语句插入中内容同时包含单引号和双引号的解决办法Shell 引号嵌套linux shell中的单引号双引号的区别(看完就不会有引号的疑问了)shell单引号与变量shell中的 单引号&&双引号 通配符&&正则表达式
shell 单引号和双引号区别shell中双引号和单引号的区别shell 单引号与双引号的区别shell脚本中单引号和双引号的区别shell脚本单引号和双引号shell 单双引号的区别shell脚本中的单引号shell 单引号与双引号shell单引号和双引号的区别shell 单引号 双引号 反引号shell中的双引号shell双引号中包含双引号shell单引号中有单引号linux shell在对双引号,单引号,反引号shell的双引号和单引号shell单引号双引号区别shell里面单引号双引号区别shell中双引号和单引号区别二年级容易写错的词语安徽佳通搬迁厂址具体哪里鼻子有可能会自己捏挺吗真三国无双8特别版有实体光盘吗pdf的图片不清晰怎么处理搜图大全好听霸气的繁体字网名男生数据库开发教程三国里本初是谁生态学基础专升本试题2019正田字格的正确写法图片