shell脚本中单引号和双引号的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本中单引号和双引号的区别相关的知识,希望对你有一定的参考价值。

参考技术A 在linux操作系统上编写shell脚本时候,我们是在变量的前面使用$符号来获取该变量的值,通常在脚本中使用”$param”这种带双引号的格式,但也有出现使用'$param'这种带引号的使用的场景,首先大家看一段例子:
复制代码代码如下:
[root@linux
~]#
name=tektea
[root@linux
~]#
echo
$name
tektea
[root@linux
~]#
sayhello=”hello
$name”
[root@linux
~]#
echo
$sayhello
hello
tektea
[root@linux
~]#
sayhello='hello
$name'
[root@linux
~]#
echo
$sayhello
hello
$name
发现了吗?没错!使用了单引号的时候,那
$name将失去原有的变量内容,仅为一般字符的显示型态而已!这里必需要特别小心在意!
所以,单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符,而不会有特殊符号,我们也可以这里理解:'$sayhello'

“\$sayhello”是相同的。
在shell脚本开发过程中,针对变量的单引号(‘)和双引号(“)都是有应用场景的,根据我的经验总结起来就是:
1.
获取变量值的时候就使用双引号(“),这是基本用法。
2.
如果是在脚本中要编写一个新的脚本,同时这个新的脚本中还需要包含变量,你就可以选择使用单引号(‘)了,特别是生成一个临时的expect脚本时,单引号(‘)就会经常使用到的。
参考技术B shell脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符。单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外,但是字符串中不能出现单引号。(注意是所有,只是单引号本身不能够出现在其中)。
双引号用于保持引号内所有字符的字面值(回车也不例外),但以下情况除外:
$加变量名可以取变量的值
反引号仍表示命令替换
\$表示$的字面值
\`表示`的字面值
\"表示"的字面值
\\表示\的字面值
除以上情况之外,在其它字符前面的\无特殊含义,只表示字面值。
从上就可以看出单引号和双引号的区别。下面举几个例子:
可见,单引号中完全是保持字符串的原型输出,而双引号进行了命令替换。
由上可见虽然单引号和双引号都是字符串的限定符,但还是有所区别。

终于知道 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脚本中单引号和双引号的区别的主要内容,如果未能解决你的问题,请参考以下文章

Shell 中单引号和双引号区别

shell中单引号和双引号

Shell中单引号和双引号区别

终于知道 Shell 中单引号双引号的区别了

linux中双引号单引号和不加引号的区别吗

shell中对于单引号,双引号和反引号的处理方式