'' 單引號,在單引號中所有的特殊符號都沒有了特殊的意義。
"" 雙引號,在雙引號中特殊符號都沒有特殊含義但是 $ ` 和 \ 例外,分別擁有
調度變量 引用命令 和 轉義符 的特殊含義
`` 反引號,反引號括起來的內容是系統命令,在bash中會優先執行,和 $() 的作用一樣,不過推薦使用$(),
反引號容易看錯
$() 和反引號的作用一樣,引用系統命令
() 用於一串命令執行時,()中的命令會在子shell中執行
{} 用於一串命令執行時,{}中的命令會在當前shell中執行,也可以用於變量變形與替換
[] 用於變量測試
# 在shell腳本中,以#開頭的行代表注釋
$ 用於調用變量的值,如需要調用變量name的值時,需要用$name的方式得到變量的值
\ 轉義符,跟在\之后的特殊符號將失去特殊含義,變為普通字符。如\$將輸出$符號,不當做變量引用
單引號和雙引號
單引號和雙引號用於變量出現空格時,比如,name=xiao ming這樣執行就會出現問題,而必須用引號括起來
比如name="xiao ming"。不過引號有單引號和雙引號之分,二者的主要區別在於,被單引號括起來的字符都是普通字符。
就算特殊字符也不再有特殊含義,而被雙引號括起來的字符中,"$"和"\"和反引號是擁有特殊含義的,"$"代表引用變量的值,而反引號
代表引用命令。
如果需要在雙引號中輸出$和反引號需要在符號前加上轉義符\
例子就略啦
反引號
如果需要調用命令的輸出,或把命令的輸出賦予變量,則命令必須使用反引號包含,這條命令才會執行。反引號的作用和$(命令)是一樣的
但是反引號容易和單引號搞混。建議使用$(命令)
小括號和大括號
父shell子shell
[root@andy ~]# pstree
systemd─┬─NetworkManager─┬─dhclient
│ └─2*[{NetworkManager}]
├─agetty
├─atd
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon
├─httpd───5*[httpd]
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rpcbind
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
├─vmtoolsd───{vmtoolsd}
├─vsftpd
├─xinetd
├─zabbix_agentd───5*[zabbix_agentd]
└─zabbix_server
[root@andy ~]#
可以看到pstree在父shell中執行的
[root@andy ~]# bash
[root@andy ~]# pstree
systemd─┬─NetworkManager─┬─dhclient
│ └─2*[{NetworkManager}]
├─agetty
├─atd
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon
├─httpd───5*[httpd]
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rpcbind
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───bash───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
├─vmtoolsd───{vmtoolsd}
├─vsftpd
├─xinetd
├─zabbix_agentd───5*[zabbix_agentd]
└─zabbix_server
[root@andy ~]#
執行一次bash后則pstree在子shell中執行的
關於父shell和子shell,可以想象成在Windows中開啟了一個cmd字符操作終端,Windows本身就是父shell,cmd就是子shell
如果用於執行一串命令,小括號和大括號的區別
()執行一串命令時,需要重新開啟一個子shell來執行
{}執行一串命令時,在當前shell中執行
()和{}都是把一串命令放在括號里面,並且命令之間用";"隔開
()最后一條命令可以不用分號
{}最后一條命令也要用分號
{}的第一條命令和左括號之間必須有一個空格
()里的各命令不必和括號有空格
在執行一串命令時,如果使用的小括號,則這串命令所做的修改只在子shell中生效
一旦命令結束,回到父shell中,這個修改就會丟失,而如果,使用的時大括號,則此串命令直接在父shell
中執行,命令結束后,修改依然生效