1、雙單引號
''
:單引號。在單引號中所有的特殊符號,如$
和"`"(反引號)都沒有特殊含義。
2、雙引號
""
:雙引號。在雙引號中特殊符號都沒有特殊含義,但是$
、"`"(反引號)和\
除外,這三個符號是有特殊含義的,擁有“呼叫變數的值”、“引用命令”和“轉義符"的特殊含義。
單引號和雙引號的區別,舉例如下:
# 1.定義變數name的值是sc
[root@localhost ~]# name=sc
# 2.如果輸出時使用單引號,則$name原封不動的輸出
[root@localhost ~]# echo '$name'
$name
# 3.如果輸出時使用雙引號,則會輸出變數name的值sc
[root@localhost ~]# echo "$name"
sc
# 4.反引號括起來的命令會正常執行
[root@localhost ~]# echo `date`
2020年 6月 21 日星期一 18:16:33 CST
# 5.但是如果反引號命令被單引號括起來,那麼這個命令不會執行,
# `date`會被當成普通字元輸出
[root@localhost ~]# echo '`date`'
`date`
# 如果是雙引號括起來,那麼這個命令又會正常執行
[root@localhost ~]# echo "`date`"
2020年 6月 21 日星期一 18:18:18 CST
3、$
符號
$
:用於呼叫變數的值,如需要呼叫變數name
的值時,需要用$name
的方式得到變數的值。
在Linux系統中,定義一個變數非常簡單,直接用變數名=變數值
的格式定義變數就可以了。而我們在檢視變數值的時候,使用$變數名
就可以檢視到。
如下,用echo
命令檢視變數name
的值,如果我們不加$
,echo
命令會認為要輸出name
字串,如果在name
前加上$
符號,echo
命令就會輸出變數name
的值。
# 定義name變數
[root@localhost ~]# name=sc
[root@localhost ~]# echo name
name
[root@localhost ~]# echo $name
sc
4、反引號
"``":反引號。反引號括起來的內容是系統命令,在Bash中會先執行它。和$()
作用一樣,不過推薦使用$()
,因為反引號非常容易看錯。
5、$()
符號
$()
:和反引號作用一樣,用來引用系統命令。
如果我們直接從命令列中執行一個系統命令(如date
命令),這個時候命令是不用$()
符號括起來的,因為Shell是可以直接呼叫系統命令的。
那什麼時候需要把系統命令括起來呢?
如定義一個變數a
,需要把date
命令的結果,賦值給a
的時候,如a=date
。這個時候就需要讓date
命令先執行,再把所得到的值賦值給變數a
。
如下示例:
[root@localhost ~]# a=date
[root@localhost ~]# echo $a
date
[root@localhost ~]# a=`date`
[root@localhost ~]# echo $a
2020年 6月 22日 星期一 18:18:18 CST
上面示例中可以看到,如果date
命令不加反引號,Shell會認為把date
字串賦值給a
變數。
總結:也就是說,只有需要把命令的結果賦值於變數的時候,才需要用反引號或者
$()
符號把命令括起來。任何命令的結果都可以賦值給變數,只要命令的結果有輸出,像cd
命令就不可以。
推薦使用$()
代替反引號。
- 練習:把
root
目錄下所有檔案的檔名存入變數b中。[root@localhost ~]# b=$(ls /root) [root@localhost ~]# echo $b anaconda-ks.cfg install.log install.log.syslog
- 綜合練習:
# 如果命令不用反引號包含,命令不會執行,而是直接輸出 [root@localhost ~]# echo ls ls # 只有用反引號包括命令,這個命令才會執行 [root@localhost ~]# echo `ls` anaconda-ks.cfg install.log install.log.syslog # 使用$(命令)的方式也是可以的 [root@localhost ~]# echo $(date) 2020年 6月 22日 星期一 18:18:18 CST
6、#
符號
#
:在Shell指令碼中,#
開頭的行代表註釋。
7、\
符號
\
:轉義符,跟在\
之後的特殊符號將失去特殊含義,變為普通字元。如\$name
將輸出$name
符號,而不當做是變數引用。