这篇文章整理一下在 shell 中单引号 '',双引号 "",和反引号 `` 的作用。

先介绍反引号。shell 会把反引号中的内容作为命令来执行,通常用于将命令执行的结果作为另一个命令的参数。 比如下面这段命令就将 cat dirs 的输出结果作为 ls 的参数。注意,在将命令执行的结果作为另一个命令的参数时, newline 会被当作参数分隔符而非命令结束符,就像下面所展示的那样:

$ cat dirs
dir1
dir2
dir3 dir4

$ ls `cat dirs`
dir1:
... ...

dir2:
... ...

dir3:
... ...

dir4:
... ...

还有一点就是,当反引号中嵌套反引号时,要用 backslash 去把位于里面的反引号 escape 掉,防止 shell 在解释外层反引号内容时把里面的也解释掉

$ mail `pick \`mailinglist\``

说完了反引号,再来说说单引号和双引号。

单引号中的内容,shell 会按照字面表示处理,也就是你单引号里面写的啥就是啥,shell 会 直接按照字符串来处理;而双引号的内容,shell 则会进去找三种 metacharacters,它们分别是 dollar $,backslash \ 和反引号 ``。对于这三种符号,shell 会按照它们的特殊意义处理, 它们的特殊意义分别是:

  • dollar $:用于传参,\$1 代表参数 1,\$2 代表参数 2,$* 则代表所有参数
  • backslash \:用于消解它后面字符的特殊含义,如 $1 就会把 dollar 符号变成单纯的字符串。 注意,\newline 会把 newline 丢弃掉,这也就是为啥你可以在输入一个比较长的命令时把 \ 放在行 尾的原因
  • 反引号 ``:用于把反引号中的内容作为命令来执行,通常用于将命令执行的结果作为另一个命令的参数

下面这段命令解释了 shell 对待单引号和双引号的区别。

$ echo 'Date is `date`'
Date is `date`

$ echo "Date is `date`"
Date is Mon May  8 01:31:40 CST 2023

这里,单引号和双引号不仅可以放在字符串的首尾,也可以单独把其中的某些字符括起来,如下面 5 条 命令的输出结果是等价的:

$ echo "x*y"
$ echo x"*"y
$ echo 'x*y'
$ echo x'*'y
$ echo x\*y

以上。