更新時(shí)間:2022-04-08 來(lái)源:黑馬程序員 瀏覽量:
Shell除了命令,還有一些作用很強(qiáng)大的符號(hào),比如引號(hào)、通配符、連接符等。這些符號(hào)在Shell命令中有著各種各樣的作用,借助這些符號(hào),用戶(hù)可以用命令完成更復(fù)雜的功能。本節(jié)將對(duì)Shell中常用的符號(hào)進(jìn)行講解。Shell除了命令,還有一些作用很強(qiáng)大的符號(hào),比如引號(hào)、通配符、連接符等。這些符號(hào)在Shell命令中有著各種各樣的作用,借助這些符號(hào),用戶(hù)可以用命令完成更復(fù)雜的功能。本節(jié)將對(duì)Shell中常用的符號(hào)進(jìn)行講解。
在Shell中,引號(hào)主要用來(lái)轉(zhuǎn)換元字符的含義。所謂元字符是指那些在正則表達(dá)式(正則表達(dá)式將在3.4節(jié)學(xué)習(xí))中具有特殊處理能力的字符,例如$、\、>等字符。
Shell中的引號(hào)有三種:?jiǎn)我?hào)('')、雙引號(hào)("")與反引號(hào)(``)。接下來(lái)分別來(lái)學(xué)習(xí)一下這幾種引號(hào)。
單引號(hào)可以將它中間的字符還原為字面意義,實(shí)現(xiàn)屏蔽Shell元字符的功能。引號(hào)里的字符串就是一個(gè)單純的字符串,沒(méi)有任何含義,例如定義變量NUM=100,在輸出變量時(shí)需要添加$符號(hào),如果這個(gè)變量加上單引號(hào)輸出,則直接將$符號(hào)與變量整體作為一個(gè)字符串輸出,命令如下所示。
[itheima@localhost ~]$NUM=100 [itheima@localhost ~]$echo $NUM 100 [itheima@localhost ~]$echo '$NUM' $NUM在第二次加單引號(hào)輸出$NUM時(shí),直接輸出了一個(gè)字符串而不是值100,單引號(hào)將$符號(hào)的功能屏蔽了。
注意:不可以在兩個(gè)單引號(hào)中間單獨(dú)插入一個(gè)單引號(hào),單引號(hào)必須要成對(duì)出現(xiàn)。
雙引號(hào)也具有屏蔽作用,但它不會(huì)屏蔽$符號(hào)、\符號(hào)和``符號(hào)。將剛才定義的變量NUM加雙引號(hào)輸出,具體如下所示:
[itheima@localhost ~]$echo "$NUM" 100
由以上輸出結(jié)果可知,使用雙引號(hào)輸出變量NUM時(shí),$符號(hào)的功能不會(huì)被屏蔽。
注意:雙引號(hào)也可以屏蔽單引號(hào)的作用,在一對(duì)雙引號(hào)中,單引號(hào)不必成對(duì)出現(xiàn)。
反引號(hào),它可以進(jìn)行命令替換。反引號(hào)與雙引號(hào)可以結(jié)合使用。例如輸出系統(tǒng)的時(shí)間,具體操作如下。
[itheima@localhost ~]$echo "Today is `date`" Today is 2017年09月07日星期四10:50:26 CST
以上所示的命令中用到了命令“date”, 該命令的功能是打印系統(tǒng)當(dāng)前的時(shí)間 。
可以把反引號(hào)嵌入到雙引號(hào)中,但是當(dāng)把反引號(hào)嵌入到單引號(hào)中時(shí),單引號(hào)會(huì)屏蔽掉反引號(hào)的功能。例如把`date`嵌入單引號(hào)中,將不會(huì)打印出當(dāng)前的時(shí)間。
[itheima@localhost ~]$echo 'Today is `date`' Today is `date`
Shell的通配符一般用于數(shù)據(jù)處理或文件名匹配,常用的通配符如下所示。
下面將對(duì)表格中所示的通配符逐一講解。
“*”如果用戶(hù)想要列出/etc目錄下以sys開(kāi)頭的所有文件,可以使用如下命令。
[itheima@localhost~]$ls -d /etc/sys* sysconfig sysctl.conf sysctl.d systemd system-release system-release-cpe
在以上命令中,sys*表示匹配以字符串sys開(kāi)頭的所有文件。-d選項(xiàng)表示僅對(duì)目標(biāo)目錄本身進(jìn)行處理,不遞歸處理目錄中的文件。
如果想輸出以.conf結(jié)尾的所有文件,則可以使用如下命令。
[itheima@localhost ~]$ls /etc/*.conf asound.conf fuse.conf man_db.conf rsyncd.conf autofs.conf GeoIP.conf mke2fs.conf rsyslog.conf autofs_ldap_auth.conf host.conf mtools.conf sestatus.conf brltty.conf idmapd.conf nfsmount.conf sos.conf ......
在這個(gè)命令中,*.conf表示匹配所有以.conf字符串結(jié)尾的文件,此命令會(huì)輸出所有以.conf結(jié)尾的文件。因?yàn)槲募啵谶@里只截取一部分。
通配符“?”每次只能匹配一個(gè)字符,通常與其它通配符結(jié)合使用。如果想查找/etc目錄下文件名是由兩個(gè)字符組成的文件,可以使用如下命令。
[itheima@localhost ~]$ls -d /etc/?? hp pm
通配符“[]”表示與[]中的任一字符匹配,它通常是一個(gè)范圍,例如,在/etc目錄,列出以f~h范圍的字母開(kāi)頭,并以.conf結(jié)尾的文件,可以使用如下命令。
[itheima@localhost ~]$ls /etc/[f-h]*.conf fprintd.conf fuse.conf GeoIP.conf host.conf
由輸出結(jié)果可知,/etc目錄下以f~h范圍內(nèi)的字母開(kāi)頭,并以.conf結(jié)尾的文件有四個(gè)。
通配符“[!]”表示除了[]里的字符,與其它任一字符匹配。例如,如果查找以y開(kāi)頭且不以.conf結(jié)尾的文件,可以使用如下命令。
[itheima@localhost ~]$ls -d /etc/y*[!.conf] yum yum.repos.d
由輸出結(jié)果可知,/etc目錄下符號(hào)條件的匹配項(xiàng)有兩個(gè)。
Shell中提供了一組用于連接命令的符號(hào),包括:“;”、“&&”以及“||”, 使 用 這 些 符 號(hào) ,可以將多條Shell指令進(jìn)行連接,使這些指令順序或根據(jù)命令執(zhí)行結(jié)果,有選擇地執(zhí)行。下面將對(duì)這些符號(hào)的功能分別進(jìn)行介紹。
使用“;”連接符間隔的命令,會(huì)按照先后次序依次執(zhí)行。假如現(xiàn)在有一系列確定的操作需要執(zhí)行,且這一系列操作的執(zhí)行需要耗費(fèi)一定時(shí)間,比如安裝gdb包時(shí),在下載好安裝包后,還需要逐個(gè)執(zhí)行以下命令:
[root@localhost ~]#tar –xzvf gdb-7.11.1.tar.gz [root@localhost ~]#cd gdb-7.11.1 [root@localhost ~]#./configure [root@localhost ~]#make [root@localhost ~]#make install [root@localhost ~]#gdb -v
且在大多數(shù)命令開(kāi)始執(zhí)行后,都需要一定的時(shí)間,等待命令執(zhí)行完畢。若此時(shí)使用“;”連接符,連接這些命令,具體如下所示:
[root@localhost ~]#tar -xzvf gdb-7.11.1.tar.gz ;cd gdb-7.11.1;./configure; make;makeinstall;gdb -v
那么系統(tǒng)會(huì)自動(dòng)執(zhí)行這一系列命令。
使用“&&”連接符連接的命令,其前后命令的執(zhí)行遵循邏輯與關(guān)系,只有該連接符之前的命令執(zhí)行成功后,它后面的命令才被執(zhí)行。
使用“||”連接符連接的命令,其前后命令的執(zhí)行遵循邏輯或關(guān)系,只有該連接符之前的命令執(zhí)行失敗時(shí),它后面的命令才會(huì)執(zhí)行。