Linux下的Shell中,单引号和双引号常用来括住包含有空格的变量值,比如var1="Linux Shell" 。而两者的区别是:单引号中的变量不会被解析,而双引号中的变量会被解析。看下面的例子:
allan@ubuntu:~$ var1="Linux Shell" allan@ubuntu:~$ echo "$var1" Linux Shell # var1变量被解析 allan@ubuntu:~$ echo '$var1' $var1 # var1变量没有被解析
当然,这是Shell中单引号与双引号的常规用法,大家都知道。但是今天我却发现一个小技巧,分享一下。
双引号内嵌单引号
看例子:
allan@ubuntu:~$ echo "I love '$var1'" I love 'Linux Shell'
可见,双引号内嵌单引号时,单引号内的变量不仅会正常解析,而且会保留单引号。我个人理解是双引号内的单引号已经退化为普通的符号,并不再具有Shell中单引号的特殊含义。这个在实际中是有非常大的用途的。
考虑这样一种场景:我们在Shell脚本中需要将log_path = '/var/log/xxx' 这行配置(配置实用单引号括起来的)写到某个配置文件(假设为example.conf),而且xxx 是一个变量,需要动态获取。那利用这种嵌套就非常好写了:
test.sh内容:
#!/bin/bash xxx=process/log_dir # 这里直接赋值,实际中可能需要动态获取 echo "log_path= '/var/log/$xxx'" >> example.conf
test.sh执行结果:
allan@ubuntu:temp$ sh test.sh allan@ubuntu:temp$ ls example.conf test.sh allan@ubuntu:temp$ cat example.conf log_path= '/var/log/process/log_dir'
在配置文件中,xxx变量既被解析,也保留了单引号。这种场景在实际中也挺常见的。
当然,单引号内嵌双引号时,变量并不会被解析,所有的东西都是原样输出。并没有特殊之处。
评论已关闭