引用
在第五章中讲到shell中的引用,shell能识别到4种不同的引用字符:
- 单引号’
- 双引号"
- 反斜线\
- 反引号`
前两种和最后一种必须成对出现,而反斜线可以在命令中根据需要多次出现,这些引用字符在shell中的含义和功能各不相同。
单引号’
shell碰到第一个’,在遇到用于封闭的’之前,shell会忽略单引号对中引用的所有特殊字符,即不再解释字符串中任何特殊字符,对内容的保护比较强,单引号最常见的地方就是一个字符串参数中含有空格时,shell通常会使用空格作为分割符,将一个字符串解释成了多个字符串参数,如下例:
$ echo one teo three four
one teo three four
$ echo 'one teo three four'
one teo three four
双引号"
双引号的作用类似于单引号,除了对于内容的保护要弱于后者,双引号会忽略引用的大部分特殊字符。具体来说,下面3个字符在双引号中不会被忽略:
- 美元符号 $
- 反引号 `
- 反斜线 \
touch file{01..10}
filelist=*
echo $filelist
file01 file02 file03 file04 file05 file06 file07 file08 file09 file10
echo '$filelist'
$filelist
echo "$filelist"
*
上面的例子中对比了不使用引号,使用单引号以及使用双引号之间的主要不同,在第3行中shell看到了星号并将其替换成当前目录下的所有文件名, 在第5行中,shell完全不处理单引号中的字符,因此显示出了" filelist"解释为"",因为文件名不会再双引号中完成,所以被只有""被传递给了echo。
当字符串中含有单引号或双引号时,可以使用双引号来保留单引号,反之亦然。
x=" hello, 'world'"
echo $x
hello, 'world'
y=' hello, "world"'
echo $y
hello, "world"
反斜线\
除了少数几处例外,反斜线(作为前缀使用)在功能上相当于在单个字符周围放置单引号,反斜线可以对紧随其后的字符进行转义。
echo >
-bash: syntax error near unexpected token `newline'
echo \>
>
x=*
echo \$x
$x
如上,shell忽略了反斜线之后的>和$x,所以不在执行变量替换。
当反斜线作为一行最后一个字符时,shell将其视为续行符,会删除随后的换行符,也不会将该换行符作为参数分隔符(假装这个字符没出现过)。在输入跨多行的长命令时经常用这种方法。
$ echo "1234\
> 5678\
> 90"
1234567890
值得注意的是反斜线的作用在双引号中也是有效的,但在单引号中被作为普通字符处理
反引号`
反引号不像之前碰到的那些引号,因为它的功能和用法和前面那三种完全不同。反引号用于告诉shell将其中的命令使用命令输出代替, shell会先执行反引号或者 (…)在功能上是一样的,只是$(…)是一种更新更可取的命令替换写法。反引号的一般使用格式为:
`command`
echo The date and time is: `date`
The date and time is: Sun Jan 5 15:17:27 CST 2020
echo The date and time is: $(date)
The date and time is: Sun Jan 5 15:17:39 CST 2020
name="AbcDefg"
#转化为大写
name=$(echo $name | tr '[a-z]' 'A-Z')
echo $name
ACDDFGH