[笔记] shell脚本中的单引号和双引号以及反引号详解

引用

在第五章中讲到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完全不处理单引号中的字符,因此显示出了" f i l e l i s t " 7 s h e l l s h e l l " filelist", 在第7行中双引号指示shell需要在其中执行变量名替换,因此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
发布了87 篇原创文章 · 获赞 28 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/MakerCloud/article/details/103942191