shell
可以识别4
种不同类型的引字符号:单引号字符'
,双引号字符"
,反斜杠字符\
,反引号字符`
,学习shell
编程的朋友可以看下。
1. 单引号( '
)
1 | grep Susan phonebook |
如果我们想查找的是 Susan Goldberg
,不能直接使用 grep Susan Goldberg phonebook
命令,grep
会把 Goldberg
和 phonebook
当作需要搜索的文件。
1 | grep 'Susan Gold' phonebook |
当 shell
碰到第一个单引号时,它忽略掉其后直到右引号的所有特殊字符。
2. 双引号( "
)
双引号作用与单引号类似,区别在于它没有那么严格。单引号告诉 shell
忽略所有特殊字符,而双引号只要求忽略大多数,具体说,括在双引号中的三种特殊字符不被忽略:$
、\
、`
。即双引号会解释字符串的特别意思,而单引号直接使用字符串。如果使用双引号将字符串赋给变量并反馈它,实际上与直接反馈变量并无差别。如果要查询包含空格的字符串,经常会用到双引号。
1 | x=* |
这个例子可以看出无引号,单引号和双引号之间的区别。在最后一种情况中,双引号告诉 shell
在引号内照样进行变量名替换,所以 shell
把 $x
替换为 *
,因为双引号中不做文件名替换,所以就把 *
作为要显示的值传递给 echo
。
对于第一种情况需要进一步说明,shell
在给变量赋值时不进行文件名替换(这从第三种情况中也能看出来),各步骤发生的精确次序如下: shell
扫描命令行,把 x
的值设为星号 *
;shell
再次扫描命令行,碰到星号 *
,把它替换成当前目录下的文件清单;shell
启动执行 echo
命令,把文件清单作为参数传递给 echo
。
这个赋值的先后次序非常重要:shell
先作变量替换,然后作文件名替换,最后把这行处理为参数。
3. 反引号(`
)
命令替换是指 shell
能够将一个命令的标准输出插在一个命令行中任何位置。shell
中有两种方法作命令替换:把 shell
命令用反引号或者 $(...)
结构括起来,其中 $(...)
格式受到 POSIX
标准支持,也利于嵌套。
1 | echo The date and time is `date` |
4. 反斜杠 backslash-escaped( \
)
反斜杠一般用作转义字符,或称逃脱字符。Linux
如果 echo
要让转义字符发生作用,就要使用 -e
选项,且转义字符要使用双引号。
1 | echo -e "\n" |
反斜杠的另一种作用,就是当反斜杠用于一行的最后一个字符时,shell
把行尾的反斜杠作为续行,这种结构在分几行输入长命令时经常使用。