1.转义
Bash 只有一种数据类型,就是字符串。不管用户输入什么数据,Bash 都视为字符串。因此,字符串相关的引号和转义,对 Bash 来说就非常重要。
某些字符在 Bash 里面有特殊含义(比如$
、&
、*
)。
echo $date
上面例子中,输出$date
不会有任何结果,因为$
是一个特殊字符,会将其与后面的date一起识别为一个变量:
如果想要原样输出这些特殊字符,就必须在它们前面加上反斜杠,使其变成普通字符。这就叫做“转义”(escape)。
echo \$date
上面命令中,只有在特殊字符$
前面加反斜杠,才能原样输出:
反斜杠本身也是特殊字符,如果想要原样输出反斜杠,就需要对它自身转义,连续使用两个反斜线(\\
)。
echo \\
上面例子输出了反斜杠本身。
反斜杠除了用于转义,还可以表示一些不可打印的字符。
\a
:响铃\b
:退格\n
:换行\r
:回车\t
:制表符
如果想要在命令行使用这些不可打印的字符,可以把它们放在引号里面,然后使用echo
命令的-e
参数。
echo a\tb
echo -e "a\tb"
上面例子中,命令行直接输出不可打印字符\t
,Bash 不能正确解释。必须把它们放在引号之中,然后使用echo
命令的-e
参数:
换行符是一个特殊字符,表示命令的结束,Bash 收到这个字符以后,就会对输入的命令进行解释执行。
换行符前面加上反斜杠转义,就使得换行符变成一个普通字符,Bash 会将其当作长度为0
的空字符处理,从而可以将一行命令写成多行。
mv \
/path/to/foo \
/path/to/bar
# 等同于
mv /path/to/foo /path/to/bar
上面例子中,如果一条命令过长,就可以在行尾使用反斜杠,将其改写成多行。这是常见的多行命令的写法。
2.单引号
Bash 允许字符串放在单引号或双引号之中,加以引用。
单引号用于保留字符的字面含义,各种特殊字符在单引号里面,都会变为普通字符,比如星号(*
)、美元符号($
)、反斜杠(\
)等。
echo '*'
echo '$USER'
echo '$((2+2))'
echo '$(echo foo)'
上面命令中,单引号使得 Bash 扩展、变量引用、算术运算和子命令,都失效了。如果不使用单引号,它们都会被 Bash 自动扩展:
由于反斜杠在单引号里面变成了普通字符,所以如果单引号之中,还要使用单引号,不能使用转义,需要在外层的单引号前面加上一个美元符号($
),然后再对里层的单引号转义。
# 不正确
echo it's
# 不正确
echo 'it\'s'
#正确
echo $'it\'s'
不过,更合理的方法是改在双引号之中使用单引号。
echo "it's"
3.双引号
双引号比单引号宽松,大部分特殊字符在双引号里面,都会失去特殊含义,变成普通字符。
echo "*"
上面例子中,通配符*
是一个特殊字符,放在双引号之中,就变成了普通字符,会原样输出。这一点需要特别留意,这意味着,双引号里面不会进行文件名扩展。
但是,三个特殊字符除外:美元符号($
)、反引号(`
)和反斜杠(\
)。这三个字符在双引号之中,依然有特殊含义,会被 Bash 自动扩展。