单引号,还是双引号

Updated: 2019-01-01

入门

  • C/Java:单引号表示字符(char),而双引号表示字符串(string)
  • JSON:只允许双引号
  • Javascript/HTML:单引号双引号通用,单引号的字符串中可以有双引号,双引号的字符串中可以有单引号(不需要转义\'\")。另,Javascript 可以使用反引号(back-tick),也就是`,来表示 Template literals,其中的变量会被展开。
  • PHP/Hack:单引号表示静态字符串,其中的变量不会被展开;双引号会插入变量的值

坑!

用任何一种以上情况好像都解释不了下面这个 bash 的例子:

$ str='cat dog'
$ printf $str
cat

所以……狗呢?!

进阶

printf的第一个参数是format string,后面跟着的是argument,所以cat被当成了format,而这个格式字符串又没有什么需要被替代的,所以被直接打印了出来成了cat。如果我们在format串中加入例如%s,在打印的时候%s就会被后面的dog取代。

$ str='cat_%s dog'
$ printf $str
cat_dog

那如果就要打印最原始的字符串怎么办?在printf的时候加上双引号

$ printf "$str"
cat dog

或者添加一个format串,然后把str当成参数:

$ printf '%s\n' "$str"
cat dog

注意这里只能是双引号,因为单引号的话类似 PHP,其中的变量是不会被展开的,而是被当成静态的字符串:

$ printf '$str'
$str