- 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=" LANG
echo $LANG
直接使用\n将无法转义。此时需引入$''字符串:
read -p "Please assign a new value to the LANG(=$LANG) variable: "$'\n\t'"LANG=" LANG
echo $LANG
如字符串中不需要变量扩张,则直接使用$'':
read -p $'Somehow\na multiline prompt\nhere: '
也可以将包含转义的可复用字符作为变量调用:
newline=$'\n'
read -p "Somehow${newline}a multiline prompt${newline}here: "

本文探讨了Shell编程中引号的使用规则,包括单引号、双引号的特性,如何避免变量扩展问题,以及反引号和转义字符的应用。通过实例说明了双引号在保持变量原样和正确解析上的重要性,适合避免意外输出并提升脚本的可读性。
2万+

被折叠的 条评论
为什么被折叠?



