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变量既被解析,也保留了单引号。这种场景在实际中也挺常见的。

当然,单引号内嵌双引号时,变量并不会被解析,所有的东西都是原样输出。并没有特殊之处。