在编写Shell脚本的时候经常用到双引号(“),单引号(‘),反引号(`),和反斜杠()。下面详细讨论一下不同符号的具体作用。在Bash中,每一个变量的值都是字符串。无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。在进行变量赋值的时候var=value,如果value中包含空白字符,例如空格,就必须使用双引号或者单引号,这样就会把引号包括的内容当做一个整体来对待,如果没有使用引号,那么bash解析器就会把所有位于第一个单词后面的内容解释为其他命令。
[appuser@hz-10-120-118-193 zhao]$ cat test.sh
#!/bin/bash
foo=''a cd'bb'
echo $foo
[appuser@hz-10-120-118-193 zhao]$ sh test.sh
test.sh: line 5: cdbb: command not found
单引号
最为严格的符号,它关闭shell中所有特殊字符的解释,即单引号里面的内容全部作为普通字符解释。不管是单引号,反引号还是反斜杠都被当做普通字符处理。单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的。如果单引号中出现了单引号,会从前往后两个一组进行解析,如果分组后遇到空格会报错,因为没有作为一个整体。
双引号
由双引号括起来的字符,除美元符号($)、反斜杠()、反引号()、和双引号(")这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待,注意单引号也是作为普通字符处理的。对于$字符来说,就是用其后指定的变量的值来代替这个变量和$;对于\字符而言,是转义字符,它告诉shell不要对其后面的那个字符进行特殊处理,只当作普通字符即可。在双引号中需要在前面加上转义字符\的只有四个字符$,\,
和”本身。而对”号,若其前面没有加\,则Shell会将它同前一个”号匹配。利用双引号引用变量能防止字符串分割,而保留变量中的空格。
[appuser@hz-10-120-118-193 zhao]$ cat test.sh
#!/bin/bash
uerid=0001
pro=0.256
json_str="{\"userid\":\"$userid\",\"value\":\"$pro\"}"
echo $json_str
[appuser@hz-10-120-118-193 zhao]$ sh test.sh
{"userid":"","value":"0.256"}
反引号
它将反引号之间的字符串当成shell命令执行,返回命令的执行结果,如果需要嵌套,注意,嵌套使用时内层的反引号必须用反斜杠(\)将其转义。“与 ()一样,建议用 ()。
反斜杠
反斜杠一般用作转义字符,反斜线符号()表示转义,将屏蔽下一个字符的特殊意义如果echo要让转义字符发生作用,就要使用-e选项,且包含转义字符的字符串要使用双引号。另外shell把行尾的反斜杠作为续行。
特殊字符
符号 | 含义 |
---|---|
& | 传递到脚本的参数数量 |
* | 匹配0个活多个在*之前的那个字符 |
+ | 匹配一次或者多次前面那个字符 |
^ | 匹配行首或者后面字符的非 |
$ | 获取变量的值 |
` | 反引号,执行包括的命令 |
“ | 双引号 |
? | 匹配0次或者1次前面那个字符 |
| | 管道字符 or 或者的意思 |
\ | 转义字符 |