Shell(Bash)單引號、雙引號和反引號用法詳解

2020-07-16 10:04:33
單引號和雙引號用於變數值出現空格時,比如 name=zhang san 這樣執行就會出現問題,而必須用引號括起來,比如 name="zhang san"。

不過,引號有單引號和雙引號之分,二者的主要區別在於,被單引號括起來的字元都是普通字元,就算特殊字元也不再有特殊含義;而被雙引號括起來的字元中,"$"、""和反引號是擁有特殊含義的,"$"代表參照變數的值,而反引號代表參照命令。還是來看例子吧:

[[email protected] ~]# name=sc
#定義變數name的值是sc
[[email protected] ~]# echo '$name'
$name
#如果輸出時使用單引號,則$name原封不動地輸出
[[email protected] ~]# echo "$name"
sc
#如果輸出時使用雙引號,則會輸出變數name的值sc
[[email protected] ~]# echo `date`
2013 10月 21 日星期一 18:16:33 CST
#反引號的命令會正常執行
[[email protected] ~]# echo '`date`'
'date'
#但是如果反引號括起來的命令又被單引號括起來,那麼這條命令不會執行,`date`會被當成普通字元輸出
[[email protected] ~]# echo "`date`"
2013年 10月 21 日星期一 18:14:21 CST
#如果被雙引號括起來,那麼這條命令又會正常執行

所以,如果需要在雙引號中間輸出"$"和反引號,則要在符號前加入跳脫符""。

反引號

如果需要呼叫命令的輸出,或把命令的輸出賦予變數,則命令必須使用反引號包含,這條命令才會執行,反引號的作用和 $(命令) 是一樣的,但是反引號非常容易和單引號搞混,所以推薦大家使用 $(命令) 的方式參照命令的輸出。命令如下:

[[email protected] ~]# echo ls
ls

如果命令不用反引號包含,那麼命令不會執行,而是直接輸出

[[email protected] -]# echo `ls`
anaconda-ks.cfg install.log install.log.syslog sh test testfile
#只有用反引號包含命令,這條命令才會執行
[[email protected] ~]# echo $(date)
2013年 10月 21 日 星期一 18:25:09 CST
#使用用$(命令)的方式也是可以的

還是這句話,不管是從容易混淆的角度,還是從 POSIX 規範的角度來說,儘量使用 $(命令) 的方式來參照命令的輸出,而不要使用反引號。