终于知道 Shell 中单引号双引号的区别了
Posted Linux开发那些事儿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了终于知道 Shell 中单引号双引号的区别了相关的知识,希望对你有一定的参考价值。
在编写 shell 脚本或输入命令时,你可能已经注意到大多数命令都可以使用单引号 或双引号, 这不仅适用于 shell 脚本,而且适用于所有 Bash 命令, 但是两种类型的引号以及 Bash shell 解释它的方式之间存在一定的差异,下面将介绍它们之间的不同
单引号
用单引号 \' \' 括起来的字符会保留引号内每个字符的字面值
简而言之,shell 将逐字解释单引号内的封闭文本,并且不会插入任何内容,包括变量、反引号、某些 \\ 转义符等
单引号中的任何字符都没有特殊含义, 当你不想使用转义字符来更改 shell 脚本解释输入字符串参数方式时,就会很方便
双引号
双引号类似于单引号,只是它允许 shell 解释美元符号 ( $ )、反引号 ( ` )、反斜杠 ( \\ ) 和感叹号 ( ! ), 这些字符与双引号一起使用时具有特殊含义,并且在显示之前对其进行评估
双引号可以通过在双引号前加上反斜杠来使用其自身
实例
下面通过几个实例来说明 单引号 和 双引号之间的一些区别
- 实例1
新建 shell 脚本 t1.sh
,内容如下
#!/bin/bash
a=98
echo "$a"
echo \'$a\'
执行 ./t1.sh
命令,结果如下
[root@localhost quotes_test]# ./t1.sh
98
$a
从结果可以看出,双引号中的 $a 被解释为变量 a 的值
但是单引号中的 $a 只是原样输出,单引号不会解释其中的 $ 以及 a 字符
- 实例2
双引号中的 \\\\n 会被转义成换行符\\n,但在单引号内,\\n 被当成普通字符与同一行的其他字符一起显示
- 实例3
新建 shell 脚本 t2.sh
, 内容如下
#!/bin/bash
ary[0]=8
echo "$ary[0]"
echo \'$ary[0]\'
执行脚本,结果如下
[root@localhost quotes_test]# ./t2.sh
8
$ary[0]
从结果可以看出,当 $ary[0] 用双引号括起来时,表示数组的第一个元素,所以输出 8
但是,被单引号括起来时,被当做单纯的字符输出,并不会解释为数组的第一个元素
- 实例4
新建 shell 脚本 t3.sh
, 内容如下
#!/bin/bash
a=45
echo "\'$a\'"
echo \'"$a"\'
执行脚本,结果如下
[root@localhost quotes_test]# ./t3.sh
\'45\'
"$a"
由上面的结果可知,单引号在双引号内没有特殊的含义,因此,即使 $a 在单引号内,也还是会解释成 45
但是,当双引号在单引号内时,即使 $a 位于双引号内,也不会对变量 a 求值, 还是按照普通字符输出
- 实例5
新建 shell 脚本 t4.sh
, 内容如下
#!/bin/bash
a=" $(printf hello) " # 相当于 " `printf hello` "
b=\' $(printf hello) \' # 相当于 \' `printf hello` \'
echo $a
echo $b
执行脚本,结果如下
[root@localhost quotes_test]# ./t4.sh
hello
$(printf hello)
从结果可以知道,双引号中的 $(printf hello) 会被解释成 printf hello 命令,执行 echo $a
命令相当于执行了 printf hello
, 结果输出 hello
单引号中的 $(printf hello) ,只是表示普通字符而已,所以 echo $b
命令的结果是 $(printf hello) 字符的原样输出
小结
本文介绍了 shell 中单引号和双引号的区别,主要是通过实例的方式来展示他们之间的不同点,熟悉了它们的不同点后,在编写 shell 脚本过程中,就不会在单双引号上出错了
以上是关于终于知道 Shell 中单引号双引号的区别了的主要内容,如果未能解决你的问题,请参考以下文章