首页 男生 其他 Linux/Unix技术丛书·跟老男孩学Linux运维:核心基础篇(上)(第2版)

10.3.2 不同引号特殊符号的知识与实践(重要)

  10.3.2 不同引号特殊符号的知识与实践(重要)

  在Linux命令行或脚本中,处理字符串时,经常会涉及引号问题,很多新手在操作命令时,不知道该不该加引号,或者应该加什么样的引号,什么时候可以不加。为此笔者在此列出了一个表格与读者分享(见表10-3),后文再进行实践演练,表10-3来源于《跟老男孩学Linux运维:Shell编程实战》的3.3.1节。

  表10-3 单引号、双引号与不加引号、反引号的知识说明

  1. 反引号(″)的介绍与实践

  简单来说,当将待处理的字符串用反引号引起来的时候,系统首先会将反引号里字符串当作命令进行解析,然后针对解析后的结果做进一步的处理。反引号一般用于引用命令,执行的时候命令会被执行,相当于“$()”,赋值和输出都要将命令用反引号(")引起来。下面以echo命令为例来检验上述描述结果:

  [root@oldboy ~]# date #<==打印系统当前日期的命令。

  Sat Mar 31 20:50:35 CST 2018

  [root@oldboy ~]# echo date #<==若不加反引号,就会将date当作字符串输出。

  date

  [root@oldboy ~]# echo `date` #<==将date命令反引起来,系统会将date当作是一个命令。

  Sat Mar 31 20:50:42 CST 2018

  [root@oldboy ~]# echo `aa` #<==aa被反引起来之后,将作为命令解析。

  -bash: aa: command not found #<==aa命令找不到,从提示信息可以得知,系统将aa当作命令执行了。

  [root@oldboy ~]# cd test/

  [root@oldboy test]# touch `date +%F`.txt #<==将命令反引起来作为待创建的文件名。

  [root@oldboy test]# ls `date +%F`.txt #<==查看,date命令见后文。

  2018-03-31.txt

  [root@oldboy test]# ls -l `which cat` #<==将查看cat命令反引起来作为ls的待处理文件。

  -rwxr-xr-x. 1 root root 48568 Mar 23 2017 /bin/cat

  2. 双引号("")的介绍与实践

  当输出双引号内的所有内容时,如果内容中有命令(要反引一下)、变量、特殊转义符等,则会先将变量、命令、转义字符解析出来,然后输出最终的内容。若在平时引用字符串时,不知道应该如何引用,则可以默认使用双引号,这种引用也称为弱引用。示例代码如下:

  [root@oldboy test]# echo "date" #<==被引用的内容作为字符串输出。

  date

  [root@oldboy test]# echo "`date`" #<==经过反引号引起来的命令会在解析后输出。

  Sat Mar 31 21:05:59 CST 2018

  [root@oldboy test]# echo "$(date)`which mkdir`" #<==经过反引号或“$()”引起来的命令会在解析后输出。

  Sat Mar 31 21:06:28 CST 2018 /bin/mkdir

  [root@oldboy test]# echo "today is `date +%w`"

  today is 6

  3. 单引号('')的介绍与实践

  简单来说,当将待处理的内容用单引号引起来时,引号里面有什么内容,处理时就一直保持引号之前的内容不变,下面用echo命令来检验上述描述结果:

  [root@oldboy test]# echo 'date' #<==即使是命令也会作为字符串原样输出。

  date

  [root@oldboy test]# echo '`date`' #<==用反引号引起来也没用,还是原样输出。

  'date'

  结论:

  当用echo输出时,用单引号引起的内容是什么,输出来的内容就是什么,不会有任何改变(就是“所见即所得”)。

  4. 无任何引号的介绍与实践

  不使用引号的功能与双引号类似,但由于没有引号,很难确定字符串的边界,因此很容易出现各种未知的操作错误,综上所述,若无特殊情况,在处理字符串内容时建议读者使用双引号替代不加引号(连续的数字字符串可以不加引号)的情况。示例代码如下:

  [root@oldboy test]# echo "today is 'date +%w'"

  today is 6

  [root@oldboy test]# echo today is 'date +%w'

  today is 6

  [root@oldboy test]# echo I am oldboy

  I am oldboy

  [root@oldboy test]# echo $(date)'which mkdir'

  Sat Mar 31 21:13:51 CST 2018 /bin/mkdir

目录
设置
手机
书架
书页
评论