xDroid's Blog

假装高冷的Geek

20.4 Shell 字符串 (从新手到菜鸟的Linux教程)

好的,我抓紧把这个坑填上就可以安利其他有趣的命令了(

我们提到过 shell 是弱类型的语言,除了数字和数组类型以外好像也就字符串类型了。个人感觉用 shell 的时候字符串类型是最多的,因为你看传参数是用字符串,就连循环

for i in `seq 1 10`
do
...
done

i 的取值 seq 1 10 都是字符串类型。记得某篇文章说过 Lisp 系统比类 Unix 系统高端之处就在于前者用表传参,而后者是用字符串传参= =

shell 里写字符串字面值有两种方式:用单引号或双引号包裹字面值。如:

$ echo 'Hello World!'
Hello World!
$ greetingString="Hello World!"
$ echo $greetingString
Hello World!

在很多脚本语言里单引号和双引号包裹是没有区别的,但是在 shell 里确实是有区别的。

  • 单引号包裹的字面值不进行转义,遇到第一个匹配的单引号停止包裹。如:

    $ echo 'Broken pair of quote '.'
    > ^C
    $ echo 'Broken pair of quote \'.'
    > ^C
    $

    因此在向 curl 等命令传 cookies 数据时,如果没有需要替换的变量,单引号包裹是最好的。

    思考题:如果想要输出一个单引号应该怎么办呢?

  • 双引号包裹的字面值进行变量替换、转义字符替换、反引号替换和(很不常用的)历史记录替换

    • 变量替换比较好理解,就是 $val 或者 ${val} 会被其变量的值所替换,如:

      $ echo "The string is '$greetingString'."
      The string is 'Hello World!'.
      $ echo "Or in another usage: '${greetingString}'."
      Or in another usage: 'Hello World!'.

      这里我们也注意到了双引号包裹的字面值中单引号没有特殊用途,而且不需要被 escape :

      $ echo "The single quote looks like ', but not \'."
      The single quote looks like ', but not \'.
    • 转义字符替换。文档里写了长长的一列,但我觉得经常用到的也就:

      字符含义
      \n换行
      \t制表符
      \\\\转义符本身
      \"双引号
      个人习惯是琢磨一下哪里输出有问题就加一个试试看……
    • 反引号替换,就是获得命令的结果然后插入到字符串末模板中,如:

      $ echo "Time for now is `date`."
      Time for now is Fri Jan 26 14:08:26 CST 2018.

双引号变量替换有另一些(八辈子都用不到)的语法我就不写了= =