双引号
会使文本以字符的形式展示,会过滤部分扩展,但是参数扩展,算数扩展和命令替换依然有效($,``,\)
单引号
抑制所有的扩展
反斜杠
转义字符,可以限制一些双引号中的扩展
实例1:
变量嵌套:可以通过抑制外层的扩展和eval命令实现
[portal@ccodtk test]$ cat test1.sh
#!/bin/bash
set -xueo pipefail
a_config="{a1,a2}"
app1_config=\${${1}_config}
echo $app1_config
eval app_config=\${${1}_config}
echo $app_config
--------------------------
[portal@ccodtk test]$ bash test1.sh a
+ a_config='{a1,a2}'
+ app1_config='${a_config}'
+ echo '${a_config}'
${a_config}
+ eval 'app_config=${a_config}'
++ app_config='{a1,a2}'
+ echo '{a1,a2}'
{a1,a2}
分析:
- 对于变量
app1_config
外层增加了转移字符后,以指了外层的扩展,从而实现了使app1_config
的内容为一个变量形式的内容 - 通过命令eval,是这个文本形式的变量内容得到bash的解析,从而展现出最后的内容
实例2:
单引号的抑制所有的转移,双引号不抑制参数扩展的转移
[root@qcteam-ciserver resources]# echo $USER
root
[root@qcteam-ciserver resources]# pwd
/home/docker/Cubes/dcmsSecurity/src/main/resources
[root@qcteam-ciserver resources]# ssh portal@10.130.25.80 'pwd; echo $USER'
/home/portal
portal
[root@qcteam-ciserver resources]# ssh portal@10.130.25.80 "pwd; echo $USER"
/home/portal
root
[root@qcteam-ciserver resources]# ssh portal@10.130.25.80 "pwd; echo \$USER"
/home/portal
portal
分析:
- 通过前两步可看到当前环境的信息;
- 第三步展示的是单引号的抑制扩展功能,将引号内的所有内容原原本本的传递过去;
- 第四步展示了双引号的不一致参数扩展的功能,
$USER
在传递之前已经被解析为当前用户的值 - 第五步展示了反斜杠在双引号中的抑制扩展功能