版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
LinuxShell命令行及腳本編程實(shí)例詳解(含CD附錄)目錄\h第1篇LinuxShell基礎(chǔ)和使用\h第1章Linux及LinuxShell簡(jiǎn)介\h1.1關(guān)于Linux\h1.2什么是LinuxShell\h1.3Shell的種類(lèi)\h1.4怎樣使用Shell\h1.5Shell腳本是什么\h1.6為什么使用Shell腳本\h1.7實(shí)例:創(chuàng)建你的第一個(gè)Shell腳本\h1.8小結(jié)\h第2章初識(shí)LinuxShell\h2.1BashShell\h2.2Shell在Linux環(huán)境中的角色\h2.3Shell中的變量\h2.4Shell環(huán)境進(jìn)階\h2.5小結(jié)\h第3章常用Shell(Bash)命令\h3.1查看文件和目錄\h3.2操作文件和目錄\h3.3管理文件或目錄權(quán)限\h3.4文本處理\h3.5其他常用命令\h3.6小結(jié)\h第4章Shell命令進(jìn)階\h4.1文件處理和歸檔\h4.2監(jiān)測(cè)和管理磁盤(pán)\h4.3后臺(tái)執(zhí)行命令\h4.4小結(jié)\h第2篇Shell腳本編程\h第5章Shell編程基礎(chǔ)\h5.1Shell腳本的第一行“#!”(Shebang)\h5.2Shell中的注釋\h5.3實(shí)例:如何設(shè)置腳本的權(quán)限和執(zhí)行腳本\h5.4Shell變量進(jìn)階\h5.5Shell算術(shù)運(yùn)算\h5.6退出腳本\h5.7實(shí)例:調(diào)試腳本\h5.8Shell腳本編程風(fēng)格\h5.9小結(jié)\h第6章Shell的條件執(zhí)行\(zhòng)h6.1條件測(cè)試\h6.2條件執(zhí)行\(zhòng)h6.3case語(yǔ)句實(shí)例\h6.4小結(jié)\h第7章Bash循環(huán)\h7.1for循環(huán)\h7.2while循環(huán)\h7.3until循環(huán)語(yǔ)句實(shí)例\h7.4select循環(huán)語(yǔ)句實(shí)例\h7.5循環(huán)控制\h7.6小結(jié)\h第8章Shell函數(shù)\h8.1函數(shù)的定義\h8.2函數(shù)的參數(shù)、變量與返回值\h8.3函數(shù)的調(diào)用\h8.4實(shí)例:將函數(shù)放在后臺(tái)運(yùn)行\(zhòng)h8.5小結(jié)\h第9章正則表達(dá)式\h9.1什么是正則表達(dá)式\h9.2正則應(yīng)用基礎(chǔ)\h9.3小結(jié)\h第10章腳本輸入處理\h10.1參數(shù)處理\h10.2選項(xiàng)處理\h10.3獲得用戶(hù)輸入\h10.4小結(jié)\h第11章Shell重定向\h11.1輸入和輸出\h11.2重定向\h11.3文件描述符\h11.4小結(jié)\h第12章管道和過(guò)濾器\h12.1管道\h12.2過(guò)濾器\h12.3小結(jié)\h第13章捕獲\h13.1信號(hào)\h13.2進(jìn)程\h13.3捕獲\h13.4小結(jié)\h第14章sed和awk\h14.1sed編輯器基礎(chǔ)\h14.2基本的sed編輯命令\h14.3sed命令實(shí)例\h14.4sed與Shell\h14.5awk基礎(chǔ)\h14.6awk與Shell\h14.7awk命令實(shí)例\h14.8小結(jié)\h第15章其他LinuxShell種類(lèi)介紹\h15.1CShell\h15.2KornShell\h15.3小結(jié)CD\h附錄注:原文檔電子版(非掃描),需要的請(qǐng)下載本文檔后留言謝謝。第1篇LinuxShell基礎(chǔ)和使用第1章Linux及LinuxShell簡(jiǎn)介第2章初識(shí)LinuxShell第3章常用Shell(Bash)命令第4章Shell命令進(jìn)階第1章Linux及LinuxShell簡(jiǎn)介歡迎來(lái)到LinuxShell的世界,在我們開(kāi)始真正的LinuxShell之旅前,先讓我們簡(jiǎn)單地了解一下關(guān)于Linux和LinuxShell的歷史及其一些相關(guān)的基本概念,以便為我們接下來(lái)的學(xué)習(xí)打下一個(gè)較好的基礎(chǔ)。希望你通過(guò)本章的學(xué)習(xí),能對(duì)LinuxShell有一個(gè)初步的了解。1.1關(guān)于Linux1.1.1什么是LinuxLinux是自由開(kāi)源的類(lèi)Unix操作系統(tǒng)。該操作系統(tǒng)的內(nèi)核由萊納斯·托瓦茲在1991年10月5日首次發(fā)布。嚴(yán)格來(lái)講,術(shù)語(yǔ)Linux只表示操作系統(tǒng)的內(nèi)核本身,但通常采用“Linux內(nèi)核”來(lái)表達(dá)該意思。Linux則常用來(lái)指基于Linux內(nèi)核的完整操作系統(tǒng),包括GUI組件和許多其他實(shí)用工具。Linux最初是作為支持Intelx86架構(gòu)的個(gè)人計(jì)算機(jī)的一個(gè)自由操作系統(tǒng)開(kāi)發(fā)的,目前Linux已經(jīng)被移植到更多的計(jì)算機(jī)硬件平臺(tái)。世界上500個(gè)最快的超級(jí)計(jì)算機(jī)90%以上運(yùn)行Linux發(fā)行版或變種,包括最快的前10名超級(jí)計(jì)算機(jī)運(yùn)行的都是基于Linux內(nèi)核的操作系統(tǒng)。Linux也被廣泛應(yīng)用在嵌入式系統(tǒng)上,如手機(jī)、平板電腦、路由器、電視和電子游戲機(jī)等。在移動(dòng)設(shè)備上廣泛使用的Android操作系統(tǒng)就是基于Linux內(nèi)核的。Linux的發(fā)展是自由軟件和開(kāi)源軟件聯(lián)盟的最著名的例子之一。只要遵循GNU通用公共許可證,任何個(gè)人和機(jī)構(gòu)都可以使用、修改和發(fā)布Linux的底層源代碼。通常情況下,Linux被打包成供桌面應(yīng)用和服務(wù)器應(yīng)用的Linux發(fā)行版。一些主流的Linux發(fā)行版包括Debian(及其派生版本,例如Ubuntu和LinuxMint)、RedHatEnterpriseLinux(及其派生版本,例如Fedora和CentOS)、openSUSE(及其商業(yè)版SUSELinuxEnterpriseServer),還有ArchLinux。Linux發(fā)行版包含Linux內(nèi)核、配套的實(shí)用程序和庫(kù),通常還有滿(mǎn)足發(fā)行版使用目的的大量應(yīng)用軟件。通常情況下,面向桌面應(yīng)用的Linux發(fā)行版包括XWindows系統(tǒng)和一個(gè)相應(yīng)的桌面環(huán)境,例如GNOME或KDE。一些這樣的發(fā)行版會(huì)包含一個(gè)用于較老的或低性能計(jì)算機(jī)的較少資源集中的桌面,例如LXDE或Xfce。一個(gè)用于服務(wù)器應(yīng)用的發(fā)行版可能會(huì)從標(biāo)準(zhǔn)安裝中略去所有的圖形環(huán)境,而包含其他的一些軟件,比如,ApacheHTTP服務(wù)和一個(gè)SSH服務(wù)。因?yàn)長(zhǎng)inux是一個(gè)自由軟件,所以任何人都可以創(chuàng)建一個(gè)符合自己應(yīng)用需求的發(fā)行版。1.1.2誰(shuí)創(chuàng)建了Linux1991年,萊納斯·托瓦茲開(kāi)始了一個(gè)項(xiàng)目,它之后成為了Linux內(nèi)核。它最初是托瓦茲用于訪(fǎng)問(wèn)大學(xué)里的UNIX服務(wù)器的一個(gè)終端模擬器。他專(zhuān)門(mén)為他當(dāng)時(shí)正在使用的硬件寫(xiě)了一個(gè)獨(dú)立于操作系統(tǒng)的程序,因?yàn)樗胧褂盟?0386處理器的新計(jì)算機(jī)的功能。這個(gè)程序的開(kāi)發(fā)是在使用GNUC編譯器的MINIX操作系統(tǒng)上完成的,即Linux的前身。如托瓦茲在他的《JustforFun》書(shū)中所寫(xiě),他最終意識(shí)到他編寫(xiě)了一個(gè)操作系統(tǒng)內(nèi)核。1991年8月25日他在Usenet上發(fā)布了這個(gè)系統(tǒng)。1.1.3Linux在日常生活中的使用你可以把Linux作為一個(gè)服務(wù)器操作系統(tǒng)使用,或作為一個(gè)你個(gè)人計(jì)算機(jī)上的獨(dú)立操作系統(tǒng)使用。作為一個(gè)服務(wù)器操作系統(tǒng),它為客戶(hù)端提供不同的服務(wù)和網(wǎng)絡(luò)資源。一個(gè)服務(wù)器操作系統(tǒng)必須具有以下特性:穩(wěn)定的;強(qiáng)壯的;安全的;高性能的。Linux提供以上所有特性,并且它是自由和開(kāi)源的。它作為一個(gè)杰出的操作系統(tǒng)可以應(yīng)用于:臺(tái)式計(jì)算機(jī);網(wǎng)站服務(wù)器;軟件開(kāi)發(fā)工作站;網(wǎng)絡(luò)監(jiān)控工作站;工作組服務(wù)器;殺手級(jí)網(wǎng)絡(luò)服務(wù),例如DHCP、防火墻、路由、FTP、SSH、郵件、代理以及代理緩存服務(wù)器等等。1.1.4LinuxKernel是什么如前面所說(shuō),Linux內(nèi)核,即Linux操作系統(tǒng)的核心。它主要由以下模塊組成:進(jìn)程管理;定時(shí)器;中斷管理;內(nèi)存管理;模塊管理;虛擬文件系統(tǒng)接口;文件系統(tǒng);設(shè)備驅(qū)動(dòng)程序;進(jìn)程間通信;網(wǎng)絡(luò)管理;系統(tǒng)引導(dǎo)。Linux內(nèi)核決定了誰(shuí)將使用這些資源,可以使用多長(zhǎng)時(shí)間,以及什么時(shí)候可以使用這些資源。它在計(jì)算機(jī)硬件和各種應(yīng)用程序之間起到了媒介的作用,如圖1.1所示。圖1.1Linux內(nèi)涵1.1.5Linux的理念如之前所述,Linux是類(lèi)Unix的操作系統(tǒng),Unix的理念是一套基于Unix操作系統(tǒng)頂級(jí)開(kāi)發(fā)者們的經(jīng)驗(yàn)提出的軟件開(kāi)發(fā)的準(zhǔn)則和哲學(xué)。因此這些理念也同樣適用于Linux操作系統(tǒng)。小即是美;讓程序只做好一件事;可移植性比效率更重要;一切即文件——使用方便而且把硬件作為文件處理是安全的;使用Shell腳本來(lái)提高效率和可移植性;避免使用可定制性低下的用戶(hù)界面;所有程序都是數(shù)據(jù)的過(guò)濾器。1.2什么是LinuxShellLinuxShell是用戶(hù)和Linux內(nèi)核之間的接口程序,為用戶(hù)提供使用操作系統(tǒng)的接口。當(dāng)從Shell向Linux傳遞命令時(shí),內(nèi)核會(huì)做出相應(yīng)的反應(yīng)。Shell是一個(gè)用戶(hù)程序,或是一個(gè)為用戶(hù)與系統(tǒng)交互提供的環(huán)境。它是一個(gè)執(zhí)行從標(biāo)準(zhǔn)輸入設(shè)備(比如鍵盤(pán)或文件)讀入的命令的語(yǔ)言解釋程序,它擁有自己內(nèi)建的Shell命令集,Shell也能被系統(tǒng)中其他應(yīng)用程序所調(diào)用。當(dāng)你登錄或打開(kāi)控制臺(tái)時(shí)Shell就會(huì)運(yùn)行。Shell不是系統(tǒng)內(nèi)核的一部分,但是它使用系統(tǒng)內(nèi)核執(zhí)行程序、創(chuàng)建文件等。我們可以通過(guò)多種方式來(lái)訪(fǎng)問(wèn)和使用Shell:終端——Linux桌面提供基于GUI的登錄系統(tǒng)。一旦登錄你就可以通過(guò)運(yùn)行X終端(XTerm)、Gnome終端(GTerm)或KDE終端(KTerm)應(yīng)用程序來(lái)訪(fǎng)問(wèn)Shell。安全Shell連接(SSH)——可以通過(guò)它遠(yuǎn)程登錄服務(wù)器或工作站來(lái)訪(fǎng)問(wèn)其Shell。使用控制臺(tái)——一些Linux系統(tǒng)同樣提供基于文本的登錄系統(tǒng)。通常情況下,登錄系統(tǒng)后就可以直接訪(fǎng)問(wèn)Shell。當(dāng)普通用戶(hù)成功登錄時(shí),系統(tǒng)將執(zhí)行一個(gè)Shell程序,Shell進(jìn)程會(huì)提供一個(gè)命令行提示符。作為默認(rèn)值,普通用戶(hù)用“$”作提示符,超級(jí)用戶(hù)(root)用“#”作提示符。一旦出現(xiàn)了Shell提示符,就可以輸入命令名稱(chēng)及命令所需的參數(shù),輸入回車(chē)后,Shell將執(zhí)行這些命令。在Shell執(zhí)行命令時(shí),Shell首先檢查命令是否是內(nèi)部命令,若不是再檢查是否是一個(gè)應(yīng)用程序(這里的應(yīng)用程序可以是Linux本身的實(shí)用程序,如date和cat,也可以是購(gòu)買(mǎi)的商業(yè)程序,如rtds,或是自由軟件,如emacs),Shell在搜索路徑里尋找這些應(yīng)用程序(搜索路徑是一個(gè)存放可執(zhí)行程序的目錄列表)。如果輸入的命令不是一個(gè)內(nèi)部命令并且在搜索路徑里沒(méi)有找到這個(gè)可執(zhí)行文件,Shell將會(huì)顯示一條錯(cuò)誤信息。如果能夠成功找到命令,該命令將被分解為系統(tǒng)調(diào)用并傳給Linux內(nèi)核。在Shell下,你可以使用如下按鍵組合來(lái)編輯和回調(diào)命令。CTRL+W:刪除光標(biāo)位置前的單詞。CTRL+U:清空行。↑,↓方向鍵:查看命令歷史。Tab:自動(dòng)補(bǔ)全文件名、目錄名和命令等等。CTRL+R:搜索先前使用的命令。CTRL+C:中止當(dāng)前命令。CTRL+D:退出登錄Shell。ESC+T:調(diào)換光標(biāo)前的兩個(gè)單詞。當(dāng)用戶(hù)準(zhǔn)備結(jié)束登錄對(duì)話(huà)進(jìn)程時(shí),可以輸入logout命令、exit命令或按CTRL+D組合鍵,結(jié)束登錄。LinuxShell的另一個(gè)重要特性是它自身就是一個(gè)解釋型的程序設(shè)計(jì)語(yǔ)言,Shell程序設(shè)計(jì)語(yǔ)言支持絕大多數(shù)在高級(jí)語(yǔ)言中能見(jiàn)到的程序元素,如函數(shù)、變量、數(shù)組和程序控制結(jié)構(gòu)等。Shell編程語(yǔ)言簡(jiǎn)單易學(xué),任何在提示符中能輸入的命令都可以放到一個(gè)可執(zhí)行的Shell腳本中。1.3Shell的種類(lèi)Linux(以及Unix或類(lèi)Unix)中的Shell有多種類(lèi)型,其中最常用的種類(lèi)有BourneShell(sh)、CShell和KornShell。這三種Shell各有優(yōu)缺點(diǎn)。BourneShell是UNIX最初使用的Shell,并且在每種UNIX上都可以使用。BourneShell在Shell編程方面相當(dāng)優(yōu)秀,但是在處理與用戶(hù)的交互方面不如其他幾種Shell。Bourne-AgainShell(bash)是Linux系統(tǒng)中最常用的Shell。它是BourneShell的擴(kuò)展,與BourneShell完全向后兼容,并且在BourneShell的基礎(chǔ)上增加、增強(qiáng)了很多特性,具有很多特色,可以提供如命令補(bǔ)全、命令編輯和命令歷史等功能,它還包含了很多CShell和KornShell中的優(yōu)點(diǎn),有靈活和強(qiáng)大的編程接口,同時(shí)又有很友好的用戶(hù)界面。CShell(csh)CShell是一種比BourneShell更適于編程的Shell,它的語(yǔ)法和用法與C語(yǔ)言很相似,Linux為喜歡使用CShell編程的人提供了TCSH。TCSH是與CShell兼容的增強(qiáng)版本。它包括命令行編輯、可編程單詞補(bǔ)全、拼寫(xiě)校正、歷史命令替換、作業(yè)控制和類(lèi)似C語(yǔ)言的語(yǔ)法。KornShell(ksh)集合了CShell和BourneShell的優(yōu)點(diǎn),并和BourneShell完全兼容。Linux系統(tǒng)提供了ksh的擴(kuò)展,它支持任務(wù)控制,可以在命令行上掛起、后臺(tái)執(zhí)行、喚醒或終止程序。Linux中還包括了一些其他的Shell類(lèi)型,如比較流行的ash和zsh等。但無(wú)論哪一種Shell,它最主要的功用都是解譯使用者在命令行提示符中輸入的指令。在MS-DOS中,也有一種Shell,它的名字是COMMAND.COM,它也用于同樣的工作,只是它顯然沒(méi)有LinuxShell這樣強(qiáng)大。每種Shell都有它的用途及各自的命令語(yǔ)法和提供不同的內(nèi)建功能。有些Shell是有專(zhuān)利的,有些則可從互聯(lián)網(wǎng)上直接免費(fèi)獲得。我們可以使用如下命令查看系統(tǒng)中所有可用的Shell:-bash-3.2$cat/etc/shells/bin/sh/bin/bash/sbin/nologin/bin/tcsh/bin/csh/bin/ksh我們看到此文件中包含了多行,每行都是一種Shell,它代表此系統(tǒng)支持多種Shell。用戶(hù)登錄到Linux系統(tǒng)時(shí),由/etc/passwd這個(gè)文件決定用戶(hù)將要使用哪種Shell,比如我們來(lái)查看root賬號(hào)在/etc/passwd這個(gè)文件中的定義:-bash-3.2$greproot/etc/passwdroot:x:0:0:SystemAdmin:/root:/bin/bash我們可以看到在輸出結(jié)果中,以冒號(hào)“:”分隔的最后一個(gè)字段就是定義此賬號(hào)在登錄后所使用的Shell,由此可知此實(shí)例中,root賬號(hào)所使用的Shell是bash。我們還可以使用如下命令來(lái)查看賬號(hào)當(dāng)前使用的Shell的類(lèi)型:-bash-3.2$echo$SHELL/bin/bash或是-bash-3.2$ps-p$$PIDTTYTIMECMD23579pts/000:00:00bash1.4怎樣使用Shell要使用Shell,你只需簡(jiǎn)單地輸入命令即可,命令即是一個(gè)用于執(zhí)行特定任務(wù)的計(jì)算機(jī)程序。如果你的系統(tǒng)啟動(dòng)后進(jìn)入的是文本模式,那么當(dāng)你登錄系統(tǒng)后就可以直接使用Shell,你可以在登錄后的Shell中輸入命令并執(zhí)行。如果你的系統(tǒng)是以圖形界面的模式啟動(dòng)的,例如GNOME桌面或是KDE桌面,那么你可以在圖形界面中單擊“應(yīng)用程序->系統(tǒng)工具->終端”來(lái)打開(kāi)一個(gè)Shell?;蛘?,你可以按Ctrl+Alt+F1組合鍵切換到虛擬控制臺(tái)并使用你的用戶(hù)名和密碼登錄。若想切換回圖形界面模式,可以簡(jiǎn)單地按Alr+F7組合鍵。Linux終端提供了一個(gè)讓你簡(jiǎn)單地與Shell(例如bash)交互的手段。Shell不過(guò)是一個(gè)解釋并執(zhí)行你在命令行提示符中輸入的命令的程序。當(dāng)啟動(dòng)GNOME、KDE或XWindow終端時(shí),這些應(yīng)用程序啟動(dòng)你的系統(tǒng)賬號(hào)中所指定的默認(rèn)Shell。你可以隨時(shí)切換到不同的Shell。接下來(lái),我們來(lái)簡(jiǎn)單了解一下Gnome終端的使用和配置。Gnome終端程序是完全可以配置的,你可以通過(guò)設(shè)置如下選項(xiàng)來(lái)定義一些屬性:前景和背景色;窗口標(biāo)題;字體大小和類(lèi)型;回滾緩沖區(qū)等。1.5Shell腳本是什么Shell腳本就像早期dos年代的.bat,最簡(jiǎn)單的功能就是將許多指令匯整在一起,讓使用者很容易地就能夠一個(gè)操作執(zhí)行多個(gè)命令,主要是方便管理員進(jìn)行設(shè)置或者管理用的。但是它比Windows下的批處理更強(qiáng)大,它提供了數(shù)組、循環(huán)、條件以及邏輯判斷等重要功能,讓使用者可以直接以Shell來(lái)寫(xiě)程序,比用其他編程語(yǔ)言編寫(xiě)的程序效率更高,畢竟它使用了Linux/Unix下的命令。Shell腳本是利用Shell的功能所寫(xiě)的一個(gè)程序,這個(gè)程序是純文本文件格式,將一些Shell的語(yǔ)法與指令寫(xiě)在里面,然后用正則表達(dá)式、管道命令以及數(shù)據(jù)流重定向等功能,以實(shí)現(xiàn)我們所需要的功能。Shell腳本是Linux/Unix編程環(huán)境的基本組成部分。Shell腳本一般由以下幾部分構(gòu)成:Shell關(guān)鍵字——例如if…else,fordo…done。Shell命令——例如export,echo,exit,pwd,return。Linux命令——例如date,rm,mkdir。文本處理功能——例如awk,cut,sed,grep。函數(shù)——通過(guò)函數(shù)把一些常用的功能放在一起。例如,/etc/init.d目錄中的大部分或全部系統(tǒng)Shell腳本所使用的函數(shù)都包含在文件/etc/init.d/functions中??刂屏髡Z(yǔ)句——例如if…then…else或執(zhí)行重復(fù)操作的Shell循環(huán)。每個(gè)Shell腳本都有它的用途,例如,備份文件系統(tǒng)和數(shù)據(jù)庫(kù)到網(wǎng)絡(luò)存儲(chǔ)服務(wù)器。Shell腳本可以像Linux下的一個(gè)命令一樣被執(zhí)行。1.6為什么使用Shell腳本Shell腳本的應(yīng)用知識(shí)對(duì)于每一個(gè)想熟練地管理Linux操作系統(tǒng)的人是必須的,即使你可能從來(lái)不必寫(xiě)腳本。比方說(shuō)在Linux機(jī)器啟動(dòng)時(shí),它執(zhí)行/etc/rc.d目錄中的Shell腳本來(lái)加載系統(tǒng)配置和運(yùn)行服務(wù),那么詳細(xì)地理解這些啟動(dòng)腳本,對(duì)于我們分析系統(tǒng)的行為或是可能修改這些腳本將是很重要的。學(xué)習(xí)編寫(xiě)Shell腳本并不難,因?yàn)樗恼Z(yǔ)法簡(jiǎn)單易懂,類(lèi)似于直接調(diào)用命令行的功能并串聯(lián)在一起,并且只有幾種規(guī)則需要學(xué)習(xí)。大部分簡(jiǎn)短的腳本可以第一次就正確執(zhí)行,即使要調(diào)試長(zhǎng)的腳本也是簡(jiǎn)單的??偟膩?lái)說(shuō),我們使用Shell具有如下一些原因:使用簡(jiǎn)單;節(jié)省時(shí)間??梢园讶唛L(zhǎng)的重復(fù)的一連串命令合并成一條簡(jiǎn)單的命令;可以創(chuàng)建你自己的自動(dòng)化工具和應(yīng)用程序;使系統(tǒng)管理任務(wù)自動(dòng)化;因?yàn)槟_本經(jīng)過(guò)很好的測(cè)試,所以使用腳本做類(lèi)似配置服務(wù)或系統(tǒng)管理任務(wù)時(shí),發(fā)生錯(cuò)誤的機(jī)會(huì)將大大減少。我們經(jīng)常會(huì)用到Shell腳本的實(shí)例有:監(jiān)控你的Linux系統(tǒng);備份數(shù)據(jù)和創(chuàng)建快照;創(chuàng)建郵件告警系統(tǒng);查找耗盡系統(tǒng)資源的進(jìn)程;查找是否所有的網(wǎng)絡(luò)服務(wù)都正常運(yùn)行等等。1.7實(shí)例:創(chuàng)建你的第一個(gè)Shell腳本要想成功地寫(xiě)一個(gè)Shell腳本,你需要做以下三件事情:寫(xiě)一個(gè)腳本;允許Shell執(zhí)行它;把它放到Shell可以找到的地方。一個(gè)Shell腳本就是一個(gè)包含ASCII文本的文件,因此可以使用一個(gè)文本編輯器來(lái)創(chuàng)建一個(gè)腳本。文本編輯器是一個(gè)類(lèi)似于讀寫(xiě)ASCII文本文件的文字處理機(jī)的程序。有很多種文本編輯器可在Linux系統(tǒng)上使用,它們既可以用于命令行環(huán)境也可以用于圖形界面環(huán)境,你可以根據(jù)喜好來(lái)選擇適合你的文本編輯器。現(xiàn)在,打開(kāi)你的文本編輯器并編寫(xiě)包含如下內(nèi)容的第一個(gè)Shell腳本:#!/bin/bash#Myfirstscriptls-l.*保存你的文件,在這里,我們就索性將其命名為my_first。腳本的第一行是很重要的。它是一個(gè)告訴Shell使用什么程序解釋腳本的特別指示。在本例中使用的是/bin/bash。其他腳本語(yǔ)言比如Perl、awk、python等也同樣使用這個(gè)機(jī)制。腳本的第二行是一個(gè)注釋。每一行中出現(xiàn)在“#”符號(hào)后的任何內(nèi)容都將被bash忽略。一旦你的腳本變得很大且很復(fù)雜時(shí),注釋將是極其重要的。它們被程序員用于解釋代碼的用途,以便其他程序員可以弄清楚。腳本的最后一行是ls命令,它將列出當(dāng)前目錄中所有以點(diǎn)開(kāi)頭的文件和目錄(即,所有隱藏文件和目錄)。默認(rèn)情況下,Linux是不允許文件執(zhí)行的(從安全上來(lái)說(shuō),這是一件非常好的事情)。下一步我們需要做的就是允許Shell執(zhí)行你的腳本。我們使用chmod命令來(lái)完成此操作,如下所示:-bash-3.2$chmod755my_script“755”將給你讀寫(xiě)和執(zhí)行的權(quán)限,其他人將只有讀和執(zhí)行的權(quán)限。如果你希望你的腳本是私有的(即,只有你可以讀寫(xiě)和執(zhí)行),則請(qǐng)使用“700”替代?,F(xiàn)在你就可以運(yùn)行你的腳本了,只需在命令行提示符中調(diào)用腳本的文件名,如下所示:-bash-3.2$./my_script你將看到腳本的運(yùn)行結(jié)果,如果腳本沒(méi)有成功運(yùn)行,請(qǐng)檢查實(shí)際保存腳本的路徑,然后切換到正確的目錄,并嘗試重新運(yùn)行腳本。1.8小結(jié)我們來(lái)總結(jié)一下,這一章我們都學(xué)習(xí)了哪些知識(shí)。Linux是自由開(kāi)源的類(lèi)Unix操作系統(tǒng)。該操作系統(tǒng)的內(nèi)核是由萊納斯·托瓦茲在1991年10月5日首次發(fā)布。Linux既可以作為服務(wù)器操作系統(tǒng)使用,也可以作為個(gè)人計(jì)算機(jī)的獨(dú)立操作系統(tǒng)使用。Linux內(nèi)核,即Linux操作系統(tǒng)的核心。它的主要模塊分以下幾個(gè)部分:存儲(chǔ)管理、CPU和進(jìn)程管理、文件系統(tǒng)、設(shè)備管理和驅(qū)動(dòng)、網(wǎng)絡(luò)通信,以及系統(tǒng)的初始化(引導(dǎo))和系統(tǒng)調(diào)用等。Linux的主要理念:一個(gè)程序只做一件事并做好、一切皆文件、小即是美、在文本文件中存儲(chǔ)配置和數(shù)據(jù)、可移植性高于效率、簡(jiǎn)單美觀。LinuxShell是用戶(hù)和Linux內(nèi)核之間的接口程序,為用戶(hù)提供使用操作系統(tǒng)的接口。Linux中最常用的Shell有BourneShell(sh)、CShell(csh)和KornShell(ksh)。如果你的系統(tǒng)啟動(dòng)后進(jìn)入的是文本模式,那么當(dāng)你登錄系統(tǒng)后就可以直接使用Shell。Shell腳本是使用純文本文件,集合了一些Shell的語(yǔ)法和指令,并用正則表示法或管道命令以及數(shù)據(jù)流重導(dǎo)向等功能,達(dá)到我們想要的處理目的的程序。Shell腳本具有使用簡(jiǎn)單、節(jié)省時(shí)間、使系統(tǒng)管理自動(dòng)化等特點(diǎn)。第2章初識(shí)LinuxShell你是否曾考慮過(guò),你是如何能在Shell中的任何目錄運(yùn)行一個(gè)標(biāo)準(zhǔn)的命令行功能(如cp),而不管這個(gè)命令是否存在于哪個(gè)目錄?Shell是怎么知道這個(gè)命令存放在哪,并且是否存在的呢?這些問(wèn)題可能使剛接觸LinuxShell環(huán)境的人感到困惑。所以在這一章中我們將認(rèn)識(shí)和了解LinuxShell及Shell環(huán)境相關(guān)的一些概念。注意:我們已經(jīng)知道LinuxShell的類(lèi)型有多種,但本書(shū)中介紹的所有LinuxShell相關(guān)的概念和實(shí)例都是以最常用的BashShell為基礎(chǔ)進(jìn)行講解的。2.1BashShell2.1.1Bash簡(jiǎn)介Bash是一個(gè)與BourneShell兼容的、執(zhí)行從標(biāo)準(zhǔn)輸入設(shè)備或文件讀取的命令的命令語(yǔ)言解釋器。Bash是Bourne-AgainShell的縮寫(xiě)。Bash與原來(lái)的UnixshShell向后兼容,并且融合了一些有用的KornShell和CShell的特性。它相對(duì)于sh在編程和交互式使用兩方面都做了功能改進(jìn)。另外,大部分的sh腳本可以在不做修改的情況下由Bash直接運(yùn)行。Bash具有很好的移植性。它使用在構(gòu)建時(shí)發(fā)現(xiàn)編譯平臺(tái)特征的配置系統(tǒng),因此可以構(gòu)建在幾乎任一種Unix版本上。2.1.2Bash提供的改進(jìn)Bash的語(yǔ)法是BourneShell語(yǔ)法的一個(gè)改進(jìn)版本。在大多數(shù)情況下,BourneShell腳本可以被Bash正常地運(yùn)行。下面列出了Bash提供的一部分改進(jìn):命令行編輯。命令行補(bǔ)全。不限制命令行歷史大小。不限制大小的數(shù)組。Bash啟動(dòng)文件——你可以運(yùn)行Bash作為一個(gè)交互式登錄Shell,或作為一個(gè)交互式非登錄Shell。條件表達(dá)式。目錄堆?!L(fǎng)問(wèn)目錄的歷史記錄。限制性Shell——更多的Shell執(zhí)行的控制模式。BashPOSIX模式——使Bash行為更接近POSIX標(biāo)準(zhǔn)的規(guī)定。2.2Shell在Linux環(huán)境中的角色Linux環(huán)境由以下幾部分構(gòu)成:內(nèi)核——Linux操作系統(tǒng)的核心。Shell——為用戶(hù)和內(nèi)核提供一個(gè)交互的接口。終端模擬器——它允許用戶(hù)輸入命令并在屏幕上回顯命令的運(yùn)行結(jié)果。Linux桌面和窗口管理器——Linux桌面是各種軟件應(yīng)用程序的集合。它包括文件管理器、窗口管理器、終端模擬器等等。由此可見(jiàn),Shell在Linux環(huán)境中扮演了非常重要的角色,包括讀取命令行、解釋它的含義并執(zhí)行、通過(guò)輸出返回執(zhí)行結(jié)果等等。2.2.1與登錄Shell相關(guān)的文件當(dāng)Linux系統(tǒng)的運(yùn)行級(jí)別為3時(shí),用戶(hù)可以從本地登錄到系統(tǒng)控制臺(tái),或在系統(tǒng)運(yùn)行級(jí)別為5時(shí),直接以圖形界面方式登錄。在這兩種情況下登錄時(shí)你都需要輸入用戶(hù)名和密碼。用戶(hù)登錄時(shí)Bash將會(huì)使用以下初始化文件和啟動(dòng)腳本:/etc/profile——系統(tǒng)級(jí)的初始化文件,定義了一些環(huán)境變量,由登錄Shell調(diào)用執(zhí)行。/etc/bash.bashrc或/etc/bashrc——其文件名根據(jù)不同的Linux發(fā)行版而異,每個(gè)交互式Shell的系統(tǒng)級(jí)的啟動(dòng)腳本,定義了一些函數(shù)和別名。/etc/bash.logout——系統(tǒng)級(jí)的登錄Shell清理腳本,當(dāng)?shù)卿汼hell退出時(shí)執(zhí)行。部分Linux發(fā)行版默認(rèn)是沒(méi)有此文件。$HOME/.bash_profile、$HOME/.bash_login、$HOME/.profile——用戶(hù)個(gè)人初始化腳本,由登錄Shell調(diào)用執(zhí)行。這三個(gè)腳本只有一個(gè)會(huì)被執(zhí)行,按照此順序查找,第一個(gè)存在的將被執(zhí)行。$HOME/.bashrc——用戶(hù)個(gè)人的每個(gè)交互式Shell的啟動(dòng)腳本。$HOME/.bash_logout——用戶(hù)個(gè)人的登錄Shell清理腳本,當(dāng)?shù)卿汼hell退出時(shí)執(zhí)行。$HOME/.inputrc——用戶(hù)個(gè)人的由readline使用的啟動(dòng)腳本,定義了處理某些情況下的鍵盤(pán)映射。2.2.2Bash啟動(dòng)腳本通過(guò)上一小節(jié)的介紹我們了解到,在用戶(hù)登錄時(shí)自動(dòng)執(zhí)行的腳本主要用于設(shè)置一些環(huán)境,例如設(shè)置JAVA_HOME的路徑。其中的一些腳本被登錄Shell調(diào)用,登錄Shell是你登錄系統(tǒng)時(shí)最先執(zhí)行的Shell。它設(shè)置一些環(huán)境,然后把這些環(huán)境授予非登錄Shell。當(dāng)用戶(hù)登錄時(shí),登錄Shell會(huì)調(diào)用如下腳本:/etc/profile——當(dāng)用戶(hù)在運(yùn)行級(jí)別3登錄系統(tǒng)時(shí)首先運(yùn)行。/etc/profile.d——當(dāng)/etc/profile運(yùn)行時(shí),會(huì)調(diào)用該目錄下的一些腳本。$HOME/.bash_profile、$HOME/.bash_login和$HOME/.profile——在/etc/profile運(yùn)行后,第一個(gè)存在的被運(yùn)行。$HOME/.bashrc——上述腳本的中一個(gè)運(yùn)行后即調(diào)用此腳本。/etc/bashrc或/etc/bash.bashrc——由$HOME/.bashrc調(diào)用運(yùn)行。當(dāng)一個(gè)交互式的非登錄Shell啟動(dòng)時(shí),Bash將讀取并運(yùn)行如下腳本:$HOME/.bashrc——如果此文件存在即被運(yùn)行。/etc/bashrc——將被$HOME/.bashrc調(diào)用運(yùn)行。/etc/profile.d——此目錄下的腳本將被/etc/bashrc或/etc/bash.bashrc調(diào)用運(yùn)行。Bash啟動(dòng)腳本主要設(shè)置的環(huán)境有:設(shè)置環(huán)境變量PATH和PS1(我們將在2.3.1小節(jié)中介紹這兩個(gè)變量);通過(guò)變量EDITOR設(shè)置默認(rèn)的文本編輯器;設(shè)置默認(rèn)的umask(文件或目錄的權(quán)限屬性);覆蓋或移除不想要的變量或別名;設(shè)置別名;加載函數(shù)。2.2.3實(shí)例:定制自己的Bash登錄腳本本小節(jié)我們將以一個(gè)實(shí)際的.bash_profile腳本為例,來(lái)學(xué)習(xí)如何定制一個(gè)自己的Bash登錄腳本。首先我們?cè)谧约篖inux賬號(hào)的home目錄下創(chuàng)建一個(gè)名稱(chēng)為.bash_profile的文件,然后使用文本編輯器打開(kāi)并編輯此文件。我們以vi文本編輯器為例,其內(nèi)容如下:$vi~/.bash_profile#.bash_profile#CustomCommandPromptexportPS1="\n\e[1;32m[\e[0;31m\u\e[0;34m@\e[0;31m\h\e[1;32m]\e[1;32m[\e[0;34m\w\e[1;32m]$"#Getthealiasesandfunctionsif[-f~/.bashrc];then.~/.bashrcfi#UserspecificenvironmentandstartupprogramsPATH=$PATH:$HOME/bin:/usr/bin:/usr/local/bin:/usr/sbin:/usr/local/sbin:/sbinexportPATHunsetUSERNAMEumask022#CustomDJRavineModificationlogin_pwd='pwd';login_date='date';login_users='users';login_uptime='uptime';server_ip='/sbin/ifconfig|grep'inetaddr:'|grep-v''|head-1|cut-d:-f2|awk'{print$1}'';disk_available=$(df-h--block-size=1024|awk'{sum+=$4;}END{printsum;}');disk_used=$(df-lh--block-size=1024|awk'{sum+=$3;}END{printsum;}');disk_size=$(df-lh--block-size=1024|awk'{sum+=$2;}END{printsum;}');disk_available_gb=$(echo"scale=2;$disk_available/(1024^2)"|bc)disk_used_gb=$(echo"scale=2;$disk_used/(1024^2)"|bc)disk_size_gb=$(echo"scale=2;$disk_size/(1024^2)"|bc)red="\033[31m"blue="\033[34m"green="\033[32m"echo-e""echo-e"${blue}+"echo-e"${green}Welcome!"echo-e"${blue}+"echo-e"${green}ServerIP:${red}"$server_ipecho-e"${green}Date:${red}"$login_dateecho-e"${green}Users:${red}"$login_usersecho-e"${green}Directory:${red}"$login_pwdecho-e"${green}Uptime:${red}"$login_uptimeecho-e"${blue}+"df-lh|column-c6|awk'{printf"\033[22;32m%s\t%s\t\033[22;31m%s\t%s\t%s\n",$1,$6,$2,$3,$4,$5}'echo-e"${green}TotalDiskSpace:${red}${disk_size_gb}GB"echo-e"${green}TotalFreeSpace:${red}${disk_available_gb}GB"echo-e"${green}TotalUsedSpace:${red}${disk_used_gb}GB"echo-e"${blue}+"編輯完成后保存并退出文本編輯器。再創(chuàng)建一個(gè)名稱(chēng)為.bashrc的文件,使用文本編輯器打開(kāi)并編輯此文件,內(nèi)容如下:$vi~/.bashrcaliasl.='ls-d.*--color=tty'aliasll='ls-l--color=tty'aliasls='ls--color=tty'aliasvi='vim'編輯完成后保存并退出文本編輯器,重新登錄系統(tǒng),將會(huì)看到類(lèi)似如下的輸出結(jié)果:+Welcome!+ServerIP:X.X.X.XDate:WedJul1017:10:56CST2013Users:rootyantaolDirectory:/home/yantaolUptime:17:10:56up2days,17:10,3users,loadaverage:0.03,0.03,0.00+FilesystemMountedSizeUsedAvail/dev/hde1/15G8.0G5.8G/dev/hde3/local208G151G46Gtmpfs/dev/shm1.9G01.9GTotalDiskSpace:223.54GBTotalFreeSpace:53.21GBTotalUsedSpace:158.90GB+yantaol@hostname][~]$whichl.aliasl.='ls-d.*--color=tty'/bin/lsyantaol@hostname][~]$whichvialiasvi='vim'/usr/bin/vim2.2.4Bash退出腳本當(dāng)?shù)卿汼hell退出時(shí),如果$HOEM/.bash_logout腳本存在的話(huà),Bash會(huì)讀取并執(zhí)行此腳本的內(nèi)容。此腳本主要有如下用途:使用clear命令清理你的終端屏幕輸出;移除一些臨時(shí)文件;自動(dòng)運(yùn)行一些命令或腳本等。2.2.5實(shí)例:定制自己的Bash退出腳本編輯文件~/.bash_logout,其內(nèi)容如下:#.bash_logout#clearthetermimalscreenclear#clearmysqlcommandhistoryecho"Clearmysqlcommandhistory"/bin/rm$HOME/.mysql_historyecho"BackupfilestoNASserver"#backupfilestoNASserver~/bin/backup.sh編輯完成后保存并退出文本編輯器。此時(shí)我們?cè)诿钚刑崾痉逻\(yùn)行exit命令,將會(huì)得到如下輸出結(jié)果:yantaol@hostname][~]$exitlogoutClearmysqlcommandhistoryBackupfilestoNASserver如果文件~/.mysql_history和~/bin/backup.sh在你的home目錄下不存在,當(dāng)運(yùn)行exit時(shí),會(huì)看到類(lèi)似如下的輸出結(jié)果:$exitlogoutClearmysqlcommandhistory/bin/rm:cannotremove'/home/yantaol/.mysql_history':NosuchfileordirectoryBackupfilestoNASserver-bash:/home/yantaol/bin/backup.sh:Nosuchfileordirectory2.2.6有效的登錄Shell的路徑/etc/shells是一個(gè)包含有效的登錄Shell全路徑名的文本文件。這個(gè)文件會(huì)被chsh命令(變更你的登錄Shell)所使用也可被其他程序查詢(xún)使用,比如ftp服務(wù)。查看/etc/shells的內(nèi)容:$cat/etc/shells會(huì)看到類(lèi)似如下的輸出結(jié)果:/bin/sh/bin/bash/sbin/nologin/bin/tcsh/bin/csh/bin/ksh你也可以使用which命令顯示shell的全路徑:$whichbash/bin/bash2.3Shell中的變量變量是任何程序或腳本的重要組成部分。變量為程序或腳本訪(fǎng)問(wèn)內(nèi)存中的可被修改的一塊數(shù)據(jù)提供了簡(jiǎn)單的方式。LinuxShell中的變量可以被指定為任意的數(shù)據(jù)類(lèi)型,比如文本字符串或是數(shù)值。你也可以通過(guò)修改Shell中的變量來(lái)改變Shell的樣式。接下來(lái)就讓我們來(lái)了解和學(xué)習(xí)一下Shell中的變量。2.3.1Shell中變量的類(lèi)型Shell中有兩種變量的類(lèi)型:系統(tǒng)變量(環(huán)境變量)和用戶(hù)自定義的變量(本地變量或Shell變量)。系統(tǒng)變量是由LinuxBashShell創(chuàng)建和維護(hù)的變量。你可以通過(guò)修改系統(tǒng)變量,如PS1、PATH、LANG、HISTSIZE和DISPLAY等,配置Shell的樣式。常用的系統(tǒng)變量(環(huán)境變量)如表2.1所示。表2.1常用系統(tǒng)變量表當(dāng)然,你可以添加上述變量到你賬號(hào)的home目錄下的初始化文件中,比如~/.bash_profile文件。這樣在你每次登錄系統(tǒng)時(shí),這些變量會(huì)被自動(dòng)設(shè)置為你需要的值。如果要查看當(dāng)前Shell的所有系統(tǒng)變量,可以在控制臺(tái)或終端輸入如下命令:$env或者$printenv你將會(huì)看到類(lèi)似如下的輸出結(jié)果:HOSTNAME=hostnameSHELL=/bin/bashTERM=vt100HISTSIZE=1000USER=yantaolLS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:MAIL=/var/spool/mail/yantaolPATH=/usr/local/bin:/bin:/usr/binINPUTRC=/etc/inputrcPWD=/home/yantaolLANG=en_US.iso88591KDE_IS_PRELINKED=1KDEDIRS=/usrHOME=/home/yantaolLOGNAME=yantaolCVS_RSH=ssh_=/usr/bin/printenv用戶(hù)自定義的變量,即由用戶(hù)創(chuàng)建和維護(hù)的變量。這一類(lèi)型的變量可以使用任何有效的變量名來(lái)定義。如果要查看當(dāng)前Shell中的所有用戶(hù)自定義變量和系統(tǒng)變量,可以在控制臺(tái)或終端上使用env命令查看,如下所示:$env你將會(huì)看到類(lèi)似如下的輸出結(jié)果:BASH=/bin/bashBASH_ARGC=()BASH_ARGV=()BASH_LINENO=()BASH_SOURCE=()BASH_VERSINFO=([0]="3"[1]="2"[2]="25"[3]="1"[4]="release"[5]="i686-redhat-linux-gnu")BASH_VERSION='3.2.25(1)-release'COLUMNS=126CVS_RSH=sshDIRSTACK=()HISTFILE=/home/yantaol/.bash_historyHISTFILESIZE=1000HISTSIZE=1000HOME=/home/yantaolHOSTNAME=hostnameHOSTTYPE=i686IFS=$'\t\n'INPUTRC=/etc/inputrcLANG=en_US.iso88591LESSOPEN='|/usr/bin/lesspipe.sh%s'LINES=40LOGNAME=yantaolLS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:'PATH=/usr/local/bin:/bin:/usr/binPIPESTATUS=([0]="0")PS1='\s-\v\$'PS2='>'PS4='+'PWD=/home/yantaolSHELL=/bin/bashSHLVL=1SUPPORTED=en_US.UTF-8:en_US:en:zh_CN.UTF-8TERM=vt100USER=yantaol_=setconsoletype=ptymyvar=showset2.3.2實(shí)例:如何定義變量和給變量賦值在Shell中,當(dāng)你第一次使用某變量名時(shí),實(shí)際上就定義了這個(gè)變量。在Shell中創(chuàng)建和設(shè)置變量是很簡(jiǎn)單的,其語(yǔ)法如下:varName=varValue我們看到可以使用賦值操作符“=”給變量賦值。輸入的次序是:變量名、賦值操作符和賦予的值,varName即是變量名,varValue是賦予varName的值。如果沒(méi)有給出varValue,則變量varName被賦予一個(gè)空字符串。在賦值操作符“=”的周?chē)?,不要有任何空格,比如下面的變量定義將會(huì)得到commandnotfound的錯(cuò)誤:varName=varValuevarName=varValuevarName=varValue可以把任意字符集合賦值給一個(gè)變量。如下所示,將字符串yantaol賦值給username:$username=yantaol或者$username="yantaol"將一個(gè)數(shù)字賦值給變量:$var=1需要注意Shell的默認(rèn)賦值是字符串賦值,比如接下來(lái)做一下操作:$var=$var+1$echo$var1+1你將看到此時(shí)變量的值是“1+1”,而不是我們預(yù)想中的值“2”。在Bash中,如果要將算術(shù)表達(dá)式的數(shù)值賦值給一個(gè)變量,可以使用let命令,如下所示:$letvar=2+1$echo$var3將一個(gè)變量的值直接賦值給另一個(gè)變量,如下所示:$a=3$b=$a$echo$b3將命令的執(zhí)行結(jié)果賦值給變量,如下所示:$var='pwd'$echo$var/home/yantaol或者也可以使用$(…)來(lái)實(shí)現(xiàn)同樣的功能:$var=$(pwd)$echo$var/home/yantaol將Bash的內(nèi)置命令read讀入的內(nèi)容賦值給變量:$echo-n"Entervar:";readvarEntervar:123$echo$var123在上例中,“echo-n"Entervar:"”語(yǔ)句是打印內(nèi)容“Entervar:”并且不換行,緊接著從標(biāo)準(zhǔn)輸入讀入內(nèi)容,這里我們輸入“123”回車(chē),read命令將讀入的內(nèi)容賦值給var,即在輸出結(jié)果中看到的,var的值是123。2.3.3變量命名規(guī)則變量名必須以字母或下劃線(xiàn)字符“_”開(kāi)頭,后面跟字母、數(shù)字或下劃線(xiàn)字符,第一個(gè)字符不能為數(shù)字。不要使用?、*和其他特殊字符命名你的變量。有效的Shell變量名示例如下:USERNAMELD_LIBRARY_PATH_varvar1注意,類(lèi)似如下的變量名是無(wú)效的:?var=123user*name=yantaol變量名是大小寫(xiě)敏感的,比如我們定義如下幾個(gè)變量:$var=123$Var=1$vAR=2$VAR=3它們都是不同的變量,如下所示:$echo$var123$echo$Var1$echo$vAR2$echo$VAR32.3.4實(shí)例:使用echo和printf打印變量的值想必通過(guò)前幾小節(jié)的實(shí)例,你已經(jīng)了解到可以使用echo命令顯示變量的值,這里還有一種顯示變量值的方法,就是使用printf命令,如下所示:$var=123$printf"%s\n"$var123printf命令提供了一個(gè)類(lèi)似于printf()系統(tǒng)接口(C函數(shù))的打印格式化文本的方法。它作為echo命令的替代,提供了更多的特性。printf命令的語(yǔ)法格式如下:printf<FORMAT><ARGUMENTS…>printf命令就是根據(jù)指定的格式<FORMAT>打印<ARGUMENTS…>的內(nèi)容。文本格式在<FORMAT>中指定,緊接著是需要格式化的所有參數(shù)。由此,一個(gè)典型的printf命令調(diào)用如下所示:printf"FirstName:%s\nLastName:%s""$FIRSTNAME""LASTNAME"其中“FirstName:%s\nLastName:%s”“$FIRSTNAME”是格式規(guī)范,而后面的兩個(gè)變量則是作為參數(shù)傳入。格式用字符串中的%s是指示打印參數(shù)的格式類(lèi)型的分類(lèi)符,這些分類(lèi)符有不同的名字,如表2.2所示。表2.2分類(lèi)符表在printf命令的格式用字符串<FORMAT>中還可以使用一些轉(zhuǎn)義字符,如表2.3所示。表2.3轉(zhuǎn)義字符表接下來(lái)讓我們通過(guò)一些實(shí)例,了解一下如何使用printf命令格式化打印變量的值。$var=shell$printf"%s\n"$varshell$printf"%1s\n"$var#如果指定的長(zhǎng)度小于參數(shù)實(shí)際的長(zhǎng)度,則打印完整的字符串shell$printf"%1.1s\n"$var#原點(diǎn)符右邊的數(shù)字指示打印參數(shù)中字符的個(gè)數(shù)s$printf"%1.2s\n"$varsh$printf"%2.6s\n"$varshell$printf"%5.6s\n"$varshell$printf"%6.6s\n"$varshell$printf"%10.4s\n"$var#如果指定打印的字符串長(zhǎng)度超過(guò)輸出的實(shí)際長(zhǎng)度,則左邊用空格補(bǔ)全shel$printf"%10.2s\n"$varsh$printf"%c\n"$vars$var=100$printf"%d\n"$var100$printf"%i\n"$var100$printf"%u\n"$var100$printf"%o\n"$var144bash-3.2$printf"%s%%\n"$var100%$var=123$printf"%x\n"$var7b$printf"%X\n"$var7B$var=12345678$printf"%e\n"$var1.234568e+07$printf"%E\n"$var1.234568E+07$printf"%g\n"$var1.23457e+07$printf"%G\n"$var1.23457E+07$var=123.45678$printf"%5.1f\n"$var#打印的數(shù)值長(zhǎng)度為5,保留小數(shù)點(diǎn)后1位數(shù)字123.5$printf"%6.2f\n"$var123.46$printf"%7.3f\n"$var123.457$printf"%9.3f\n"$var#打印的數(shù)值長(zhǎng)度為9,數(shù)值實(shí)際長(zhǎng)度為7,保留小數(shù)點(diǎn)后3位,左面用空格補(bǔ)全123.457$printf"%10.3f\n"$var123.457$var="abcdefghi'l\mn"$printf"%q\n""$var"abc\def\ghi\\'l\\mn與printf命令不同,echo命令沒(méi)有提供格式化選項(xiàng),因此echo命令也比printf命令更簡(jiǎn)單易用,當(dāng)你知道所要顯示的變量的內(nèi)容不會(huì)引起問(wèn)題時(shí),echo命令是一個(gè)很好的顯示簡(jiǎn)單輸出的命令。echo命令也提供轉(zhuǎn)義字符的功能,可以使用的轉(zhuǎn)義字符與printf命令中的基本相同,但需使用“-e”選項(xiàng)激活轉(zhuǎn)義字符功能。下面我們通過(guò)一些實(shí)例來(lái)了解如何使用echo命令打印變量的值。$var=10$echo"Thenumberis$var"Thenumberis10$echo-e"Username:$USER\tHomedirectory:$HOME\n"Username:yantaolHomedirectory:/home/yantaol有時(shí),你需要使用${}避免一些歧義。例如:$LOGDIR="/var/log/"$echo"Thelogfileis$LOGDIRmessages"其輸出結(jié)果如下所示:ThelogfileisBash將嘗試查找一個(gè)叫做LOGDIRmessages的變量,而不是$LOGDIR。為了避免這種歧義,在這里我們就需要使用${}語(yǔ)法,如下所示:$echo"Thelogfileis${LOGDIR}messages"Thelogfileis/var/log/messages2.3.5變量的引用當(dāng)引用一個(gè)變量時(shí),通常最好是用雙引號(hào)將變量名括起來(lái)。例如,"$variable"。這樣可以防止被引用的變量值中的特殊字符(除:$、'和\)被解釋為其他錯(cuò)誤含義。使用雙引號(hào)可以防止變量值中由多個(gè)單詞組成的字符串分離。一個(gè)用雙引號(hào)括起來(lái)的變量使它自身變成一個(gè)單一詞組,即使它的值中包含空格。我們用一個(gè)實(shí)例來(lái)了解一下雙引號(hào)在引用變量中的作用,如下所示:$LIST="onetwothree"$forvarin$LIST#將變量LIST的值分成了3個(gè)參數(shù)傳遞給了for循環(huán)>do>echo"$var">doneonetwothree$forvarin"$LIST"#將變量LIST的值作為一個(gè)整體傳入for循環(huán)>do>echo"$var">doneonetwothree我們?cè)倏匆粋€(gè)更復(fù)雜點(diǎn)的例子:var1="avariablecontainingfivewords"COMMANDThisis$var1#執(zhí)行帶有7個(gè)參數(shù)的COMMAND命令:"This""is""a""variable""containing""five""words"COMMAND"Thisis$var1"#執(zhí)行帶有一個(gè)參數(shù)的COMMAND命令:"Thisisavariablecontainingfivewords"var2=""#賦予一個(gè)空字符串COMMAND$var2$var2$var2#相當(dāng)于無(wú)參數(shù)執(zhí)行COMMAND命令COMMAND"$var2""$var2""$var2"#執(zhí)行帶有3個(gè)空參數(shù)的COMMAND命令COMMAND"$var2$var2$var2"#執(zhí)行帶有1個(gè)參數(shù)(兩個(gè)空格)的COMMAND命令注意:只有在變量的值中包含空格或要保留其中的空格時(shí),將變量用雙引號(hào)括起才是必要的。下面我們來(lái)看一下使用echo命令打印一些奇怪的變量值,如下所示:$var="'(]\\{}\$\""$echo$var'(]\{}$"$echo"$var"#在這里,使用雙引號(hào)和不用雙引號(hào)打印的值沒(méi)有區(qū)別'(]\{}$"$IFS='\'#我們?cè)?.3.1小節(jié)中講過(guò),IFS是Bash的內(nèi)部變量,此變量定義Shell的內(nèi)部字段分隔符$echo$var#不加雙引號(hào)的情況下,其打印的值中反斜杠“\”被轉(zhuǎn)換成了空格'(]{}$"$echo"$var"'(]\{}$"$$var2="\\\\\""$echo$var2"$echo"$var2"\\"$var3='\\\\'$echo"$var3"\\\\$$echo"$(echo'"')"#$(echo'"')相當(dāng)于'echo'"''"$var4="Twowords"$echo"\$var4="$var4""$var4=Twowords單引號(hào)的操作類(lèi)似于雙引號(hào),但是它不允許引用變量,因?yàn)樵趩我?hào)中字符“$”的特殊含義將會(huì)失效。每個(gè)特殊的字符,除了字符',都將按字面含義解釋。2.3.6實(shí)例:export語(yǔ)句的使用在前面章節(jié)(主要參見(jiàn)2.2.2小節(jié))的學(xué)習(xí)中,我們了解到用戶(hù)登錄系統(tǒng)后,系統(tǒng)將啟動(dòng)一個(gè)登錄Shell。在這個(gè)Shell中,可以聲明一些變量,也可以創(chuàng)建并運(yùn)行Shell腳本程序。運(yùn)行Shell腳本時(shí),系統(tǒng)將創(chuàng)建一個(gè)子Shell,當(dāng)此Shell腳本運(yùn)行完畢時(shí),這個(gè)子Shell將終止,環(huán)境將返回到執(zhí)行該腳本運(yùn)行之前的Shell。默認(rèn)情況下,所有用戶(hù)定義的變量只在當(dāng)前Shell內(nèi)有效,它們不能被后續(xù)的Shell引用,要使某個(gè)變量可以被子Shell引用,可以使用export命令將變量進(jìn)行輸出。Bash的內(nèi)置命令export會(huì)將指定給它的變量或函數(shù)自動(dòng)輸出到后續(xù)命令的執(zhí)行環(huán)境。export命令的語(yǔ)法如下所示:export[-fnp][變量或函數(shù)名稱(chēng)]=[變量設(shè)置值]-f選項(xiàng)表示export一個(gè)函數(shù);-n選項(xiàng)表示將export屬性從指定變量或函數(shù)上移除;-p選項(xiàng)打印當(dāng)前Shell所有輸出的變量,與單獨(dú)執(zhí)行export命令結(jié)果相同。接下來(lái)我們用實(shí)例來(lái)了解一下export命令的用途,比如,我們創(chuàng)建一個(gè)變量JAVA_HOME,然后給它賦予一個(gè)值“/usr/local/jdk”,如下所示:$JAVA_HOME=/usr/local/jdk使用echo命令顯示變量的值:$echo$JAVA_HOME/usr/local/jdk現(xiàn)在,我們運(yùn)行一個(gè)新的子Shell:$bash再使用echo命令顯示變量JAVA_HOME的值:bash-3.2$echo$JAVA_HOME你將會(huì)得到一個(gè)空行,因?yàn)樽兞縅AVA_HOME沒(méi)有被輸出到新的子Shell。下面我們看一下使用export命令后的結(jié)果。我們先退出子Shell,如下所示:bash-3.2$exitexit然后運(yùn)行export命令,將變量JAVA_HOME輸出到后續(xù)命令的執(zhí)行環(huán)境:$exportJAVA_HOME現(xiàn)在,運(yùn)行一個(gè)新的子Shell,再使用echo命令顯示變量JAVA_HOME的值:bash-3.2$bashbash-3.2$echo$$30798bash-3.2$echo$JAVA_HOME/usr/local/jdk再運(yùn)行一個(gè)新的子Shell,變量JAVA_HOME仍然有效:bash-3.2$bashbash-3.2$echo$$31812bash-3.2$echo$JAVA_HOME/usr/local/jdk注意:系統(tǒng)變量會(huì)自動(dòng)輸出到后續(xù)命令的執(zhí)行環(huán)境。2.3.7實(shí)例:如何刪除變量Bash下使用unset命令來(lái)刪除相應(yīng)的變量或函數(shù)。unset命令會(huì)把變量從當(dāng)前Shell和后續(xù)命令的環(huán)境中刪除。其命令的語(yǔ)法如下:unset[-fv][變量或函數(shù)名稱(chēng)]-f選項(xiàng)表示刪除一個(gè)已定義的函數(shù);-v選項(xiàng)表示刪除一個(gè)變量。下面我們學(xué)習(xí)一下unset命令的使用:bash-3.2$exportJAVA_HOME=/usr/local/jdkbash-3.2$unsetJAVA_HOMEbash-3.2$echo$JAVA_HOME注意:使用unset命令不能刪除一個(gè)只讀的變量,否則將會(huì)出現(xiàn)類(lèi)似如下的錯(cuò)誤:$readonlyJAVA_HOME=/usr/local/jdk$echo$JAVA_HOME/usr/local/jdk$unsetJAVA_HOME-bash:unset:JAVA_HOME:cannotunset:readonlyvariable2.3.8實(shí)例:如何檢查變量是否存在你可以使用類(lèi)似如下的語(yǔ)法,來(lái)檢查一個(gè)變量是否存在:${varName?Error:Thevariableisnotdefined}上述語(yǔ)句的含義是如果變量varName已定義且不為空,則此語(yǔ)句就相當(dāng)于$varName;如果變量varName的值是空,則此語(yǔ)句的值也是空;但如果varName是未定義的,則此語(yǔ)句將返回一個(gè)錯(cuò)誤,并顯示問(wèn)號(hào)“?”定義的錯(cuò)誤信息“Error:Thevariableisnotdefined”?;蛘撸部梢允褂孟旅孢@個(gè)語(yǔ)句:${varName:?Error:Thevariableisnotdefined}此語(yǔ)句和上一條語(yǔ)句的唯一區(qū)別是:如果變量varName的值是空,此語(yǔ)句也將返回一個(gè)錯(cuò)誤。這兩個(gè)語(yǔ)句對(duì)于腳本的完整性檢查是有用的,如果使用這兩個(gè)語(yǔ)句檢查的變量未定義,那么腳本將會(huì)停止執(zhí)行。下面我們用一個(gè)實(shí)例來(lái)演示,如何使用上述格式的語(yǔ)句檢查一個(gè)變量是否存在,如下所示:$JAVA_HOME=/usr/local/jdk#定義一個(gè)變量JAVA_HOME,并賦予值“/usr/local/jdk”$echo${JAVA_HOME?ERROR:Thevariableisnotdefined}#檢查變量是否存在,并打印變量的值/usr/local/jdk$unsetJAVA_HOME#刪除變量JAVA_HOME$echo${JAVA_HOME:?ERROR:Thevariableisnotdefined}#檢查變量是否存在,并打印變量的值-bash:JAVA_HOME:ERROR:ThevariableisnotdefinedBash中還有一種更常用的檢查變量是否存在的方法,即使用if語(yǔ)句判斷變量是否存在。我們將在后面的條件測(cè)試章節(jié)中,對(duì)使用if語(yǔ)句進(jìn)行條件判斷做詳細(xì)地講解。2.4Shell環(huán)境進(jìn)階通過(guò)前幾節(jié)的學(xué)習(xí),想必你對(duì)LinuxShell環(huán)境已經(jīng)有了基本的了解,現(xiàn)在你應(yīng)該已經(jīng)知道了本章開(kāi)始提出的關(guān)于標(biāo)準(zhǔn)命令為什么從Shell中的任何路徑都可以訪(fǎng)問(wèn)的問(wèn)題的答案。沒(méi)錯(cuò),這是因?yàn)镾hell會(huì)在PATH環(huán)境變量指定的全部路徑中搜索任何可執(zhí)行的文件,一旦找到與輸入相匹配的命令就執(zhí)行。那么,接下來(lái)就讓我們更進(jìn)一步地了解和學(xué)習(xí)Shell環(huán)境相關(guān)的知識(shí)。2.4.1實(shí)例:回調(diào)命令歷史Bash將命令歷史保存在緩沖區(qū)或是默認(rèn)文件~/.bash_history中。歷史命令緩沖區(qū)中可以保存很多命令,其保存命令的多少由環(huán)境變量HISTSIZE定義。可以使用history命令顯示你在命令行提示符下輸入的命令列表,如下所示:$history6exit7rm-f.tcshrc8ln-sf/opt/swe/tools/in/env/tcshrc.tcshrc9ls-al.tcs10ls-al.tcshrc11exit12exit13hostname14history15ps-ef|grepsgd16id17exit18pwd19pwd20cd/svn/21ls……在上例中可以看到,history命令可以顯示歷史命令列表的行號(hào)。可以在命令行提示符下使用↑和↓方向鍵找到之前執(zhí)行過(guò)的命令。在命令行提示符下,按Ctrl+r組合鍵后輸入相應(yīng)的關(guān)鍵字可以搜索歷史命令,比如,按Ctrl+r組合鍵后輸入export,將會(huì)看到類(lèi)似如下所示:(reverse-i-search)'export':exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/sasl2/lib在Shell命令行提示符下,可以簡(jiǎn)單地輸入!!,來(lái)重復(fù)執(zhí)行上一條執(zhí)行過(guò)的命令,如下所示:$uptime13:00:28up2days,13:00,4users,loadaverage:0.00,0.01,0.00$!!uptime13:00:32up2days,13:00,4users,loadaverage:0.00,0.01,0.00你還可以回調(diào)最近一次執(zhí)行的以指定字符開(kāi)頭的命令,如下所示:$!upuptime13:24:08up2days,13:23,4users,loadaverage:0.00,0.01,0.00甚至你可以使用由history命令列出的列表的行號(hào)來(lái)重新調(diào)用相應(yīng)的歷史命令,如下所示:$history……990uptime991uptime992mansvn993history994pwd995history……$!991uptime13:32:39up2days,13:32,4users,loadaverage:0.09,0.06,0.02$!994pwd/home/yantaol2.4.2實(shí)例:Shell中的擴(kuò)展Shell中擴(kuò)展的方式有8種,它們分別是(按擴(kuò)展的先后順序排序):大括號(hào)擴(kuò)展、波浪號(hào)擴(kuò)展、參數(shù)和變量擴(kuò)展、命令替換、算術(shù)擴(kuò)展、進(jìn)程替換、單詞拆分和文件名擴(kuò)展。參數(shù)和變量擴(kuò)展我們將在5.4.2小節(jié)做詳細(xì)的介紹,算術(shù)擴(kuò)展將在5.5.3小節(jié)做詳細(xì)介紹,還有進(jìn)程替換依賴(lài)于操作系統(tǒng)的支持,我們這里就不做詳細(xì)介紹,所以本小節(jié)我們主要介紹大括號(hào)擴(kuò)展、波浪號(hào)擴(kuò)展、命令替換和文件名擴(kuò)展。大括號(hào)擴(kuò)展是一種能夠生成任意字符串的機(jī)制。進(jìn)行大括號(hào)擴(kuò)展的模式在形式上有一個(gè)可選的前綴,其后是一組包含在大括號(hào)內(nèi)的用逗號(hào)分隔的字符串或是序列表達(dá)式,最后是一個(gè)可選的后綴。例如:$echoa{b,c,d}eabeaceade從上面的實(shí)例即可以看出,前綴部分在包含在大括號(hào)中的每個(gè)字符串的前面,而后綴將會(huì)附加到每個(gè)結(jié)果字符串的尾部,整個(gè)擴(kuò)展將從左向右進(jìn)行。我們?cè)倏磶讉€(gè)大括號(hào)內(nèi)是序列表達(dá)式的例子:$echo{a..z}#按字母表順序顯示a~z的字母abcdefghijklmnopqrstuvwxyz$echo{0..10}#顯示0~10的數(shù)字012345678910$echo{5..-3}#按順序顯示5~-3的數(shù)字543210-1-2-3$echo{g..a}gfedcba$echo{1..3}{a..c}1a1b1c2a2b2c3a3b3c大括號(hào)擴(kuò)展也可以是嵌套的。每個(gè)擴(kuò)展字符串的結(jié)果是不排序的,依然按照從左到右的順序依次擴(kuò)展,例如:$echoa{{b,c,d}a,{e,f,g}b,h}iabaiacaiadaiaebiafbiagbiahi$echo{a,b{1..3},c}ab1b2b3c大括號(hào)擴(kuò)展可以和許多命令配合使用,可以使你的命令更簡(jiǎn)化,比如我想在主目錄下創(chuàng)建三個(gè)目錄,我可以使用類(lèi)似如下語(yǔ)句:$mkdir~/{dir1,dir2,dir3}#在home下創(chuàng)建dir1、dir2、dir3三個(gè)子目錄關(guān)于mkdir命令我們會(huì)在后面3.2節(jié)中做詳細(xì)介紹,你也可以使用man參考手冊(cè)查看了解此命令。在Bash4.0中還提供了一些大括號(hào)擴(kuò)展的新功能,比如,在序列表達(dá)式中指定一個(gè)增量<INCR>,其格式如下所示:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年創(chuàng)業(yè)孵化器發(fā)展項(xiàng)目可行性研究報(bào)告
- 2025年民宿經(jīng)濟(jì)發(fā)展與規(guī)范化可行性研究報(bào)告
- 產(chǎn)假期間協(xié)議書(shū)
- 生鐵購(gòu)銷(xiāo)合同范本
- 中德合作協(xié)議書(shū)
- 2025年居家養(yǎng)老服務(wù)體系建設(shè)項(xiàng)目可行性研究報(bào)告
- 高中三年暗戀理科男神不敢表白漫劇
- 不經(jīng)歷風(fēng)雨怎么見(jiàn)彩虹英語(yǔ)怎么說(shuō)
- 醫(yī)院安全督導(dǎo)員面試問(wèn)題及參考答案
- 物流行業(yè)市場(chǎng)開(kāi)發(fā)崗位面試問(wèn)題及答案
- 2025云南省人民檢察院招聘22人筆試考試備考題庫(kù)及答案解析
- 銀行行業(yè)公司銀行客戶(hù)經(jīng)理崗位招聘考試試卷及答案
- 2026年安全生產(chǎn)管理培訓(xùn)課件與事故預(yù)防與應(yīng)急處理方案
- 2026天津市靜海區(qū)北師大實(shí)驗(yàn)學(xué)校合同制教師招聘81人(僅限應(yīng)屆畢業(yè)生)考試筆試備考題庫(kù)及答案解析
- 2025陜西陜煤澄合礦業(yè)有限公司招聘570人參考筆試題庫(kù)及答案解析
- 2025年倉(cāng)儲(chǔ)服務(wù)外包合同協(xié)議
- 2025遼寧沈陽(yáng)金融商貿(mào)經(jīng)濟(jì)技術(shù)開(kāi)發(fā)區(qū)管理委員會(huì)運(yùn)營(yíng)公司招聘60人考試歷年真題匯編帶答案解析
- 2025年刑法學(xué)考試試題及答案
- 廣東省汕頭市金平區(qū)2024-2025學(xué)年七年級(jí)上學(xué)期期末地理試題
- 2025年二手車(chē)交易市場(chǎng)發(fā)展可行性研究報(bào)告及總結(jié)分析
- 北京市交通運(yùn)輸綜合執(zhí)法總隊(duì)軌道交通運(yùn)營(yíng)安全專(zhuān)職督查員招聘10人考試參考題庫(kù)附答案解析
評(píng)論
0/150
提交評(píng)論