Shell编程中主要以字符串实现数据传递,因此也赋予引号更多含义。为避免一些不必要的麻烦,你应当首先考虑使用双引号引用参数变量;引号和转义是Shell中对字符串进行解析、扩展的主要手段。
引号释义
1.单引号
去除字符串中的所有特殊含义,也即保持引号内的原始内容。
$ echo & # 在后台执行echo$ echo '&' # 打印&$ echo "$PATH" # 打印系统环境变量$ echo '$PATH' # 防止变量名扩展,直接打印$PATH
2.双引号
允许变量名扩展($var
)、子进程($(command)
或`command`
)和转义操作(\
)。以下字符失去特殊含义:
作为argument分隔符的空格变为普通空格具有强约束的单引号变为普通单引号字符模型匹配特殊字符变为普通字符扩展$HOME
的~
特殊字符变为普通字符…
相比于不带任何引号,双引号可以将可能存在的字符分割或扩展视作一个整体。
$ echo "$PATH" # 打印变量PATH的值$ echo "${PATH%%:*}" # 仅输出第一条环境变量
注:一个关于是否使用双引号而带来不同结果的例子:
files=$(find . -type f)
不使用双引号,echo $files
的输出为
<file1> <files2> <file3> ...
原来find
通过newline
粉葛的输出结果被shell
解释为空格。而使用双引号,echo "$files"
的输出为:
<file1><file2><file3>...
可以保持find
的原本输出。由此例可以看出,在一般情形下应当保持使用双引号修饰变量的习惯,避免意料之外的输出结果。
3.反引号
通过`<command>`
在子进程中执行命令,一般建议用$(command)
替代,显式执行。
4.反斜杠
转义,使特殊字符失去特殊含义。在没有引号或双引号内有效,在单引号中无效。
5.$’…’(ANSI C like strings)
比单引号的条件宽松,允许转义字符转义,具有移植性。例如,当需要在read prompt
中使用在多行字符串时:
read -p "Please assign a new value to the LANG(=$LANG) variable: \n\tLANG=" LANGecho $LANG
直接使用\n
将无法转义。此时需引入$''
字符串:
read -p "Please assign a new value to the LANG(=$LANG) variable: "$'\n\t'"LANG=" LANGecho $LANG
如字符串中不需要变量扩张,则直接使用$''
:
read -p $'Somehow\na multiline prompt\nhere: '
也可以将包含转义的可复用字符作为变量调用:
newline=$'\n'read -p "Somehow${newline}a multiline prompt${newline}here: "
参考
BashFAQ - QuotesQuotes and escaping [Bash Hackers Wiki]如果觉得《【Shell秒懂系列】引用及转义(单引号/双引号/反斜杠/反引号)》对你有帮助,请点赞、收藏,并留下你的观点哦!