- 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: "
参考