shell 脚本编程之引用

来源:互联网 发布:淘宝小二误判如何申诉 编辑:程序博客网 时间:2024/05/18 20:52

四种引用符

shell 中字符分为两种,一种是普通字符,另一种是元字符(meta)。元字符是 shell 的保留字符,在 shell 中有着特殊的意义。引用是指将字符串用某种符号括起来,以防止特殊字符被解析成其它意思。shell 中有四种引用符,用双引号,单引号,反引号和转义字符。

转义字符 \

特殊字符无法直接输出,因为特殊字符会被解析成其特殊意义。比如要打印美元符号 $

[ljx@localhost ~]$ echo $177[ljx@localhost ~]$ echo \$17$17

第一条命令,$ 符号被解析成取变量的值,$1 取的是脚本的第一个参数,因为这里并没有执行脚本,所以 $1 的值为空,最后输出的结果是7。正确的写法是第二条命令,使用转义字符 \ 来使特殊字符显示为字符本身。
除了 $ 符号,双引号、单引号,反引号,星号,百分号,问号,感叹号,分号,转义符号,各种括号等等都是特殊字符,要使它们显示为字面的符号,就需要在前面加上转义字符 \。

部分引用 “

转义字符可以阻止单个字符被解析成特殊意义,但如果是字符串的话可以使用其它的引用方式。使用双引号括起来的引用称为部分引用,又叫弱引用;顾名思义就是不是完全的引用。使用双引号括起来的引用,$符,`符和 \ 符仍会被解析成特殊意义,其它字符都会被解析成字面意义。

[ljx@localhost ~]$ var="a    b     c"[ljx@localhost ~]$ echo $vara b c[ljx@localhost ~]$ echo "$var"a    b     c

可以看到,使用双引用括起来之后,$ 符号仍被解析为取变量的值。当变量的值中有连续多个空格时,直接输出变量的值只会多个空格中的一个,如果想保留所有的空格,就需要使用引用的方式。

全引用 ‘

使用单引号括起来的引用称为全引用,又叫强引用;顾名思义就是完全的引用。包括 $符,` 符,\ 符在内的所有特殊字符都会被解析成字面意思。单引号引用内不能再出现单引号,因为这样引号配对就乱了,用转义字符来转义单引号也不行,因为转义字符在单引号引用内被解析成普通字符,转义工作无法正常进行。

[ljx@localhost ~]$ echo '$PWD'$PWD[ljx@localhost ~]$ echo "$PWD"/d/learn/shell[ljx@localhost ~]$ echo 'It's a dog'> 'Its a dog[ljx@localhost ~]$ echo "It's a dog"It's a dog[ljx@localhost ~]$ echo It\'s a dogIt's a dog

使用单引号引用时,$ 被解析成普通字符,所以输出结果为 $PWD,使用双引号引用时,$ 仍被解析成取变量值,所以输出结果为 /d/learn/shell。使用单引号引用将 It's a dog括起来,字符串中的单引号与第一个单引号配对了,所以就剩下了一个单引号没法配对;当按下回车时命令并没有执行,而是继续等待输入,继续输入一个单引号,命令才执行,输出结果为 Its a dog,中间的单引号被解析成引用了。正确的写法是后面那两种写法。

命令替换 `

命令替换是指将系统命令的标准输出作为值赋给变量,使用反引号 ` 括起来的引用就是命令替换。除了反引号之外,还可以使用 $()。两者的功能是等价的,但使用 $() 比 ` 会好点;一方面,反引号和单引号看起来太像了,难以区分;另一方面,$() 支持嵌套,而 ` 不支持。但是,$() 只有在 bash 中才有效,而 ` 在所有 unix shell 中都有效,因此反引号更加普遍。

[ljx@localhost ~]$ date1=`date`[ljx@localhost ~]$ date2=$(date)[ljx@localhost ~]$ echo $date1 $date22017073115:34:56 2017073115:35:02
原创粉丝点击