1.2.6 转义符

在计算机科学与远程通信中,当将转义符放在字符序列中时,它将对其后续的几个字符进行替代并解释。通常,可以通过上下文判定某字符是否为转义符。转义符即标志着转义序列开始的那个字符。

转义序列通常有两种功能。第一种功能是编码无法用字母表直接表示的特殊数据;第二种功能是表示无法直接通过键盘输入的字符(如回车符)。

本节说的转义符就对应第二种功能,即将转义符自身和后面的字符看作一个整体,表示某种含义。常见的示例是用反斜线“\”作为转义符,表示那些不可打印的ASCII控制符。另外,在统一资源标识符(Uniform Resource Identifier,URI)中,请求串中的一些符号有特殊含义,也需要转义,转义符使用百分号“%”。

V1-6 转义符

在日常工作中经常会遇到转义符,如在Shell中删除文件时,如果文件名中有星号“*”,则需要转义,使用了转义符后,“*”就能作为文件名使用了。


rm access_log* # 删除当前目录下文件名以access_log开头的文件
rm access_log\* # 删除当前目录下文件名为access_log*的文件

又如,在双引号中又使用双引号时就需要转义,转义之后才能正常表示双引号,否则会报语法错误。例如:


printf "This is a string with \"double quotes\" inside it.\n"

输出结果如下。


This is a string with "double quotes" inside it.

1. 反斜线

在Shell中,反斜线(\)是一个特殊字符,用于改变一些字符的含义。例如,可以使用反斜线来输出特殊字符,或者将特殊字符视为普通字符。

Shell中有很多元字符,如果要查找星号(*)、加号(+)、问号(?)本身,而不是元字符,则需要对其进行转义。常见的转义序列如表1-9所示。

表1-9 常见的转义序列

使用以下命令输出一个反斜线字符:


echo "\\"

输出结果如下。


\

反斜线也可以用来输出其他特殊字符,如使用以下命令输出换行符:


echo -e "Hello\nWorld"

输出结果如下。


Hello
World

使用以下命令输出一个水平制表符:


echo -e "Hello\tWorld"

输出结果如下。


Hello World

2. 反引号

在Shell中,反引号(`)用于标识被执行的命令,并且命令的输出会替换反引号中的内容,这称为命令替换。

使用命令替换将命令的输出赋给一个变量:


foo=`date`
echo $foo
Mon Jan 9 15:16:27 CST 2023

使用命令替换在其他命令中包含命令的输出:


echo Today is `date`
Today is Thu Nov 23 05:33:29 PM CST 2023

如果将命令的输出用作另一个命令的参数,或者将命令的输出赋给一个变量以供脚本中以后使用,则命令替换可能很有用。注意,反引号字符和单引号(')字符不同,单引号用于标识应该被当作字面值处理的字符串,而不对其进行任何解释或替换。

3. 双引号

在Shell中,双引号(")是一种特殊的字符,用于标识带有变量或转义符的字符串。双引号作为转义符时,可以方便地在字符串中输出变量的值,以及输出特殊字符。

使用双引号时,变量名会被替换为变量的值,而转义符会按照其原来的意义被解释。例如:


name="John"
echo "My name is $name"
echo "This is a \"quote\""

输出结果如下。


My name is John
This is a "quote"

在双引号内,如果需要输出双引号本身,则可以使用反斜线(\)将其转义。例如:


echo "This is a \"quote\""

输出结果如下。


This is a "quote"

4. 单引号

在Shell中,单引号(')是一种特殊的字符,用于标识字符串,其中的内容不会被解释。单引号作为转义符时,可以方便地保留字符串中的内容。

使用单引号时,变量名和转义符都不会被替换或解释。例如:


name="John"
echo 'My name is $name'
echo 'This is a \"quote\"'

输出结果如下。


My name is $name
This is a \"quote\"

如果需要在单引号内输出单引号本身,则可以通过组合单引号和双引号实现。例如:


echo 'This is a '"'"'quote'"'"''

输出结果如下。


This is a 'quote'