when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.
之前简单的总结过 bash 中单引号与双引号,但是并没有对单双引号的区别进行细致的描述,更多的偏向于解释 shell 特定功能的保留字,今天看到了一篇对于 bash 的单双引号内内容转义讲述更详细的文章,故而更新记形成此记录
bash 引号的语义可由下述三句描述简单归纳:
单引号用来直出字面量,其内容部分不允许转义,包括单引号转义也不允许双引号内允许命令替换和对特定几个字符转义,双引号内的反斜线对其他字符没有特殊含义,会被当作字面量处理bash 版本声明,本文后续所有的命令执行在当前 bash 环境中
1 | $ bash --version |
bash 里反斜线用来转义下一个字符,保持下一个字符的字面值。例如:
1 | $ echo \$PS2 # \$ 表示字面量 $ |
⚠️ 注意:shell 只负责处理参数和调用命令,不会识别 \t, \n,\x68 等其他编程语言里的 ASCII 特殊字符,这些特殊字符的处理通常在具体的软件中,比如 echo, printf 等。 例如:
1 | $ echo -e 'a\tb' # \t 的语义并不是由 shell 表达的,shell 只是把这个长度为 4 的字符串 a\tb 传递给 echo 程序,后者将会收到参数 argv[1] === "a\\tb" |
反斜线后一个字符是换行时是上一条规则的例外,表示连行,一个命令可以分行写。例如:
1 | $ echo abc | \ |
单引号用来保持引用内容的所有字面量,包括反斜线和换行符;即,一对单引号中不得出现单引号,它前面有反斜线也不行。例如:
1 | $ echo -e '\x68\x61\x72\x74\x74\x6c\x65' |
如果单引号之间出现单引号,引用内容立即结束。例如:
1 | $ echo -e 'foo\'bar' # 回车 |
双引号也是保持引用内容的字面量,但 $,`,\ 除外(POSIX 标准),其中:
反斜线后是 $,`,",\,换行时反斜线才表示转义,否则反斜线没有特殊含义(表示一个反斜线字面量)。例如:
1 | # "\\x" 的第一个反斜线表示转义,解释为 "\x",而 "\x" 中的反斜线没有特殊含义,也解释为 "\x" |
⚠️ 注意:" 在双引号语法中表示字面量双引号,这在单引号语法中是不允许的
如果不熟悉 Bash 引号的语义,尤其是配合管道和 xargs 等命令时,事情会变得很复杂很难以理解。例如:
1 | # 把 16 进制 ASCII 转为字符串 harttle |
转义过程解析:
⚠️ 注意:
be slow to promise and quick to perform.