编程:从入门到放弃
    前言
    语言和环境
    +=
    C和C++
    Hex
    Map
    Scope(1):"这"是啥
    Scope(2)
    Singleton
    什么顺序
    从A到Z
    函数
    切分字符串
    初始化(1)
    初始化(2)
    单引号,还是双引号
    参数传递
    左,还是右
    引用
    时间(1)
    时间(2)
    时间(3)
    时间(4)
    时间(5)
    比大小
    流氓甘地
    相等,还是不等(1)
    相等,还是不等(2)
    相等,还是不等(3)
    相等,还是不等(4)
    第一个说了算,还是最后一个
    语言和环境
    除以0
    随机数

单引号,还是双引号

Updated: 2022-08-06

入门。

  • 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