社区编辑申请
注册/登录
终于知道 Shell 中单引号双引号的区别了
系统 Linux
在编写 shell 脚本或输入命令时,你可能已经注意到大多数命令都可以使用单引号 或双引号, 这不仅适用于 shell 脚本,而且适用于所有 Bash 命令, 但是两种类型的引号以及 Bash shell 解释它的方式之间存在一定的差异,下面将介绍它们之间的不同。

本文转载自微信公众号「Linux开发那些事儿」,作者LinuxThings 。转载本文请联系Linux开发那些事儿公众号。

在编写 shell 脚本或输入命令时,你可能已经注意到大多数命令都可以使用单引号 或双引号, 这不仅适用于 shell 脚本,而且适用于所有 Bash 命令, 但是两种类型的引号以及 Bash shell 解释它的方式之间存在一定的差异,下面将介绍它们之间的不同

单引号

用单引号 ' ' 括起来的字符会保留引号内每个字符的字面值

简而言之,shell 将逐字解释单引号内的封闭文本,并且不会插入任何内容,包括变量、反引号、某些 \ 转义符等

单引号中的任何字符都没有特殊含义, 当你不想使用转义字符来更改 shell 脚本解释输入字符串参数方式时,就会很方便

双引号

双引号类似于单引号,只是它允许 shell 解释美元符号 ( $ )、反引号 ( ` )、反斜杠 ( \ ) 和感叹号 ( ! ), 这些字符与双引号一起使用时具有特殊含义,并且在显示之前对其进行评估

双引号可以通过在双引号前加上反斜杠来使用其自身

实例

下面通过几个实例来说明 单引号 和 双引号之间的一些区别

实例1

新建 shell 脚本 t1.sh ,内容如下

  1. #!/bin/bash 
  2.  
  3. a=98 
  4. echo "$a" 
  5. echo '$a' 

执行 ./t1.sh 命令,结果如下

  1. [root@localhost quotes_test]# ./t1.sh  
  2. 98 
  3. $a 

从结果可以看出,双引号中的 $a 被解释为变量 a 的值

但是单引号中的 $a 只是原样输出,单引号不会解释其中的 $ 以及 a 字符

实例2

双引号中的 \\n 会被转义成换行符\n,但在单引号内,\n 被当成普通字符与同一行的其他字符一起显示

实例3

新建 shell 脚本 t2.sh, 内容如下

  1. #!/bin/bash 
  2.  
  3. ary[0]=8 
  4. echo "${ary[0]}" 
  5. echo '${ary[0]}' 

执行脚本,结果如下

  1. [root@localhost quotes_test]# ./t2.sh  
  2. ${ary[0]} 

从结果可以看出,当 ${ary[0]} 用双引号括起来时,表示数组的第一个元素,所以输出 8

但是,被单引号括起来时,被当做单纯的字符输出,并不会解释为数组的第一个元素

实例4

新建 shell 脚本 t3.sh, 内容如下

  1. #!/bin/bash 
  2.  
  3. a=45 
  4. echo "'$a'" 
  5. echo '"$a"' 

执行脚本,结果如下

  1. [root@localhost quotes_test]# ./t3.sh  
  2. '45' 
  3. "$a" 

由上面的结果可知,单引号在双引号内没有特殊的含义,因此,即使 $a 在单引号内,也还是会解释成 45

但是,当双引号在单引号内时,即使 $a 位于双引号内,也不会对变量 a 求值, 还是按照普通字符输出

实例5

新建 shell 脚本 t4.sh, 内容如下

  1. #!/bin/bash 
  2.  
  3. a=" $(printf hello) "  # 相当于 " `printf hello` " 
  4. b=' $(printf hello) '  # 相当于 ' `printf hello` ' 
  5. echo $a 
  6. echo $b 

执行脚本,结果如下

  1. [root@localhost quotes_test]# ./t4.sh  
  2. hello 
  3. $(printf hello) 

从结果可以知道,双引号中的 $(printf hello) 会被解释成 printf hello 命令,执行 echo $a 命令相当于执行了 printf hello , 结果输出 hello

单引号中的 $(printf hello) ,只是表示普通字符而已,所以 echo $b 命令的结果是 $(printf hello) 字符的原样输出

小结

本文介绍了 shell 中单引号和双引号的区别,主要是通过实例的方式来展示他们之间的不同点,熟悉了它们的不同点后,在编写 shell 脚本过程中,就不会在单双引号上出错了

 

责任编辑:武晓燕 来源: Linux开发那些事儿
相关推荐

2011-05-19 13:45:15

2022-05-19 23:40:34

SQL语句引号

2022-03-23 14:04:32

SQL字符串数据类型

2009-12-25 15:59:25

shell编程

2019-05-13 15:20:07

Linux括号引号

2017-05-15 21:50:54

同话题下的热门内容

超实用的 Linux 高级命令,运维同仁一定要懂!五种常见 Linux 系统安装包管理工具中文使用指南一学就会:如何在 Linux 中挂载远程文件系统或目录Linux下,如何自动对日志进行压缩备份?Linux内存管理(Golang实现)选择 Linux 发行版时要考虑的六个重要因素如何在 Linux 中连接到串行控制台如何在 Linux 上正确使用 cat 命令

编辑推荐

Linux系统下安装MySQL的步骤详解CentOS与Ubuntu有什么不同?Linux下如何使用minicom USB串口为什么你可能想要略过Ubuntu 17.04?Linux中7个判断文件系统类型的方法
我收藏的内容
点赞
收藏

51CTO技术栈公众号