《我要學(xué)Linux操作系統(tǒng)》學(xué)習(xí)參考-第六章_第1頁(yè)
《我要學(xué)Linux操作系統(tǒng)》學(xué)習(xí)參考-第六章_第2頁(yè)
《我要學(xué)Linux操作系統(tǒng)》學(xué)習(xí)參考-第六章_第3頁(yè)
《我要學(xué)Linux操作系統(tǒng)》學(xué)習(xí)參考-第六章_第4頁(yè)
《我要學(xué)Linux操作系統(tǒng)》學(xué)習(xí)參考-第六章_第5頁(yè)
已閱讀5頁(yè),還剩76頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、我要學(xué)Linux操作系統(tǒng)第6章 Red Hat Linux 9的shell程序 6.1 shell簡(jiǎn)介 6.2 創(chuàng)建和執(zhí)行shell程序 6.3 shell環(huán)境變量及設(shè)置文件 6.4 shell腳本編程 6.5 shell程序跟蹤本章概述本章概述Shell的原意是外殼,用來(lái)形容物體外部架構(gòu)。各種操作系統(tǒng)都有自己的shell,在DOS系統(tǒng)中,它的shell就是程序,而Windows操作系統(tǒng)的程序shell是explorer.exe程序。與Windows等操作系統(tǒng)不同,Linux系統(tǒng)中將shell獨(dú)立于操作系統(tǒng)核心程序之外,使得用戶可以在不影響操作系統(tǒng)本身的情況下進(jìn)行修改,更新版本或添加新的功能。

2、第6章 Red Hat Linux 9的shell程序操作系統(tǒng)的shell程序,介于用戶和操作系統(tǒng)內(nèi)核(Kernel)之間,負(fù)責(zé)將用戶的命令解釋成操作系統(tǒng)可以接受的指令,然后由操作系統(tǒng)來(lái)執(zhí)行這些指令,并將操作系統(tǒng)執(zhí)行的結(jié)果以用戶可以了解的方式反饋給用戶。6.1.1 shell及shell編編程在Linux系統(tǒng)中,shell是操作系統(tǒng)的外殼,為用戶提供使用操作系統(tǒng)的接口,它是命令語(yǔ)言、命令解釋程序和程序設(shè)計(jì)語(yǔ)言的統(tǒng)稱(chēng)。shell是用戶和操作系統(tǒng)之間的一個(gè)接口。用戶在命令提示符下輸入的每個(gè)命令都首先由shell程序進(jìn)行解釋?zhuān)缓笤賯鹘oLinux內(nèi)核的。 6.1 shell的簡(jiǎn)介 6.1.1 she

3、ll及及shell編程編程shell是一個(gè)命令解釋器。它擁有自己內(nèi)建的shell命令集,可以用它來(lái)啟動(dòng)、掛起、停止一些程序。此外shell也能被系統(tǒng)中的其他有效的Linux應(yīng)用程序所調(diào)用。shell還是一個(gè)解釋型的程序設(shè)計(jì)語(yǔ)言。shell程序設(shè)計(jì)語(yǔ)言支持絕大多數(shù)高級(jí)程序設(shè)計(jì)語(yǔ)言中常用的元素,比如函數(shù)、變量、數(shù)組和控制結(jié)構(gòu)。shell編程簡(jiǎn)單易學(xué),在任何命令提示符中能鍵入的命令都可以在shell程序中使用。而且一旦掌握,它將成為工作中的得力工具。和DOS和Windows不同,Linux提供了多種shell程序供用戶選擇使用,使用不同類(lèi)型shell的原因是它們都有各自的特點(diǎn)。一般某個(gè)用戶登錄系統(tǒng)時(shí)

4、的shell都在/etc/passwd6.1 shell的簡(jiǎn)介 6.1.1 shell及及shell編程編程文件的最后一個(gè)字段中定義,用戶可以通過(guò)修改該字段來(lái)替換其使用的shell。另外,用戶在文本模式下登錄系統(tǒng)后,Linux的初始化程序initd就會(huì)為每個(gè)用戶啟動(dòng)一個(gè)shell,可以使用“Alt+F1F6”來(lái)獲取shell提供的多個(gè)虛擬控制臺(tái),使用虛擬控制臺(tái)的最大好處就是,當(dāng)一個(gè)虛擬控制臺(tái)上的程序由于出錯(cuò)給鎖住輸入時(shí),用戶可以進(jìn)入另一個(gè)虛擬控制臺(tái),然后殺死該進(jìn)程。如果系統(tǒng)使用了X Window的圖形模式,那么虛擬終端的切換就要使用“Ctrl+Alt+F1F6”。6.1 shell的簡(jiǎn)介 6.

5、1.1 shell及及shell編程編程6.1.2 bash在Linux中,用戶可以選擇使用多種不同類(lèi)型的shell。在RedHat Linux 9的/etc/shells文件中,列出了目前系統(tǒng)可以使用的shell。并且給出了這些shell程序的位置。具體如下圖所示。6.1 shell的簡(jiǎn)介 6.1.2 bashRedHat Linux 9中的最常用的幾種shell是Bourne shell(sh)、C shell(csh)、Ash shell(ash)、Korn shell(ksh)和Bourne Again shell(bash)等。每種shell都有自己的特點(diǎn),一般的Linux系統(tǒng)默認(rèn)使

6、用bash。1bash簡(jiǎn)簡(jiǎn)介Bourne shell是最早被大量使用及標(biāo)準(zhǔn)化的shell,幾乎所有的Linux都支持它。它是由貝爾實(shí)驗(yàn)室開(kāi)發(fā)的,由于開(kāi)發(fā)者是Steven Bourne,所以被命名為“Bourne shell”。Bourne Again shell(bash)是Bourne shell的擴(kuò)展,與Bourne shell完全兼容,并且在其基礎(chǔ)上增加和增強(qiáng)了很多功能。其中包括了很多csh和ksh的優(yōu)點(diǎn)。bash不僅有非常靈活和強(qiáng)大的編程接口,同時(shí)又有非常友好的用戶界面。它內(nèi)建40個(gè)shell命令和12個(gè)命令行參數(shù)。目前bash6.1 shell的簡(jiǎn)介 6.1.2 是大多數(shù)Linux默

7、認(rèn)的shell,RedHat Linux 9也默認(rèn)使用bash。bash有許多特色,可以使用方向鍵查閱以前輸入的命令,即history功能??梢詫?duì)命令行進(jìn)行編輯,甚至可以在忘記了命令名時(shí)請(qǐng)求shell通過(guò)命令行補(bǔ)齊進(jìn)行幫助,方法就是在敲入命令的一部分時(shí),再按下Tab鍵即可。例如,在命令行提示符下輸入ls,再按下“Tab”鍵,bash會(huì)幫助用戶列出所有以“l(fā)s”打頭的命令名,供用戶選擇。如圖下所示。6.1 shell的簡(jiǎn)介 6.1.2 bashbash的命令行補(bǔ)齊bash也內(nèi)建了幫助功能,可以給出所有內(nèi)建命令和每個(gè)系統(tǒng)命令的幫助信息??梢允褂谩癶elp ”的方法獲得指定命令的幫助信息。在RedH

8、at Linux 9中環(huán)境表變量SHELL記錄了系統(tǒng)當(dāng)前使用的shell程序的名稱(chēng),可以通過(guò)返回環(huán)境變量SHELL的值來(lái)查看當(dāng)前系統(tǒng)使用的shell程序,如圖下所示。6.1 shell的簡(jiǎn)介 6.1.2 bash查看系統(tǒng)當(dāng)前的2bash的功能shell是操作系統(tǒng)的外殼。RedHat Linux 9中默認(rèn)使用的shell是bash,它為用戶提供使用操作系統(tǒng)的接口,承擔(dān)著用戶與操作系統(tǒng)內(nèi)核之間進(jìn)行溝通的任務(wù)。除此之外,bash程序還兼?zhèn)淙缦碌墓δ埽?)交互式處理從用戶登錄系統(tǒng)開(kāi)始,shell程序就是在系統(tǒng)終端中顯示不同的命令行提示符(root用戶登錄系統(tǒng)則提示符顯示“#”,普通用戶登錄則顯示“$”

9、),然后等待用戶輸入命令。在接收來(lái)自用戶輸入的命令后,bash會(huì)根據(jù)命令的不同的類(lèi)型(包括程序或shell內(nèi)置命令)來(lái)執(zhí)行,在執(zhí)行完畢后,bash將結(jié)果回傳給用戶,并且再次回到命令提示符,以等待用戶的下一次輸入。這種模式會(huì)一直繼續(xù)下去,直6.1 shell的簡(jiǎn)介 6.1.2 到用戶執(zhí)行exit或是按下Ctrl+D來(lái)注銷(xiāo),bash才會(huì)結(jié)束,bash的這種與用戶溝通的方式稱(chēng)為“交互式處理”。2)命令補(bǔ)全功能所謂“命令補(bǔ)全”是指在用戶輸入命令的時(shí)候,無(wú)需輸入完整的命令行,Linux系統(tǒng)的shell會(huì)自動(dòng)查找出最符合的命令名稱(chēng),供用戶選擇。這樣的功能可以幫用戶節(jié)省輸入長(zhǎng)串命令的時(shí)間。例如,在/root

10、目錄下有一個(gè)testexecvp.c文件,如果想查看其中的內(nèi)容,并不需要完整輸入該文件的名稱(chēng),而只要輸入開(kāi)頭的幾個(gè)字母,即輸入“more /root/teste”,然后按下Tab鍵一次,Linux的bash會(huì)自動(dòng)補(bǔ)足完整的命令(more /root/testexecvp.c)。6.1 shell的簡(jiǎn)介 6.1.2 另一種情況就是,如果系統(tǒng)中有多個(gè)文件都與輸入的前綴相同,那么當(dāng)用戶連續(xù)按下2次Tab鍵時(shí),系統(tǒng)會(huì)顯示當(dāng)前目錄下所有具有相同前綴的文件名稱(chēng),供用戶選擇。例如,輸入“more test”后按2次Tab鍵,結(jié)果如圖下所示。6.1 shell的簡(jiǎn)介 6.1.2 bashbash的補(bǔ)齊功能sh

11、ell的補(bǔ)全功能,不但方便,而且可以避免由于用戶輸入錯(cuò)誤的路徑而執(zhí)行錯(cuò)誤的程序。3)查閱歷史記錄history命令在RedHat Linux 9中,每當(dāng)用戶輸入的命令并按下Enter后,都會(huì)被記錄在命令記錄表中,默認(rèn)情況下,bash默認(rèn)使用的命令記錄表文件為用戶主目錄下的.bash_history(文件名前面的“.”表示這是一個(gè)隱藏文件)文件??梢允褂铆h(huán)境變量HISTSIZE來(lái)定義命令記錄表的條數(shù),默認(rèn)的記錄條數(shù)為1000條。6.1 shell的簡(jiǎn)介 6.1.2 在RedHat Linux 9中可以直接瀏覽.bash_history文件,或使用history命令來(lái)查看目前的命令記錄。如下圖所示

12、。6.1 shell的簡(jiǎn)介 6.1.2 bashbash的補(bǔ)齊功能系統(tǒng)提供的history命令可以列出完整的系統(tǒng)在該用戶登錄時(shí)執(zhí)行過(guò)的所有命令,并以命令執(zhí)行的先后順序列出記錄的號(hào)碼。如果要查看最近執(zhí)行的命令,則可以使用“history n”命令,其中,n表示需要查看的最近執(zhí)行的命令的條數(shù)。如下圖所示,列出系統(tǒng)最近執(zhí)行的10條命令。6.1 shell的簡(jiǎn)介 6.1.2 bash查看最近的10條命令記錄bash的history功能提供了一種執(zhí)行命令的最快的方法,就是使用命令記錄號(hào)碼。在RedHat Linux 9的命令記錄中,每條用戶執(zhí)行過(guò)的命令都會(huì)被賦一個(gè)記錄號(hào)碼,用戶可以利用這些記錄號(hào)碼來(lái)執(zhí)行

13、指定的要執(zhí)行的舊命令。其語(yǔ)法如下:!例如,要執(zhí)行478條記錄標(biāo)記的命令,可以在命令行提示符下執(zhí)行如下:rootmyhost root# !478結(jié)果如右圖所示。6.1 shell的簡(jiǎn)介 6.1.2 bash使用!執(zhí)行命令4)別名(alias)功能Linux中的別名功能是指提供給用戶使用自定義的簡(jiǎn)單字符串,來(lái)替換復(fù)雜的命令選項(xiàng),或是替換連續(xù)多個(gè)命令的連續(xù)組合的功能,從而使得用戶可以自定義符合自己習(xí)慣的操作命令。例如,對(duì)于熟悉DOS和Windows的用戶來(lái)說(shuō),dir命令可以方便地顯示當(dāng)前目錄的內(nèi)容,但是在Linux中完成該功能的命令是“l(fā)s l”。如果希望使用dir來(lái)代替ls l,則可以使用ali

14、as功能來(lái)創(chuàng)建一個(gè)到ls l的別名,如下圖所示。6.1 shell的簡(jiǎn)介 6.1.2 bashbash的alias功能如果希望查看當(dāng)前Linux系統(tǒng)中使用的別名命令,可以直接輸入“alias”命令。如果需要取消特定的別名命令,可以使用unalias命令。例如,取消dir別名命令可使用如下命令。rootmyhost root# unalias dir使用alias命令查看并取消別名命令的結(jié)果如下圖所示。6.1 shell的簡(jiǎn)介 6.1.2 bash查看并取消別名命令5)后臺(tái)處理Linux是多用戶多任務(wù)的操作系統(tǒng),它允許多個(gè)用戶同時(shí)登錄系統(tǒng),也允許多個(gè)程序同時(shí)執(zhí)行。但因?yàn)閟hell使用交互式模式,

15、目前執(zhí)行的命令會(huì)一直掌握系統(tǒng)的控制權(quán),直到該程序結(jié)束為止,這類(lèi)程序稱(chēng)為前臺(tái)程序(Foreground)。shell采用的這種前臺(tái)程序接管系統(tǒng)控制權(quán)的模式,使得個(gè)別用戶無(wú)法使用Linux提供的多任務(wù)功能來(lái)增加效率,因此,shell提供了后臺(tái)處理功能來(lái)解決上述問(wèn)題。6.1 shell的簡(jiǎn)介 6.1.2 通常,Linux后臺(tái)運(yùn)行的都是比較耗時(shí)的程序,如編譯核心或是下載Linux的安裝文件等,但是后臺(tái)任務(wù)在執(zhí)行期間,用戶仍然可以和shell繼續(xù)交互,以下達(dá)其他的命令。要在RedHat Linux 9中要執(zhí)行后臺(tái)程序,只要在輸入命令的時(shí)候,在命令后面加上“&”符號(hào)。系統(tǒng)就會(huì)開(kāi)始以后臺(tái)的方式執(zhí)行該

16、命令,屏幕將顯示該后臺(tái)運(yùn)行程序的進(jìn)程PID,然后shell將回到命令提示符狀態(tài),以等待用戶的下一個(gè)命令的輸入。例如,將top命令投入后臺(tái)運(yùn)行。如下圖所示。6.1 shell的簡(jiǎn)介 6.1.2 bash后臺(tái)運(yùn)行當(dāng)前某個(gè)任務(wù)在前臺(tái)運(yùn)行之后,就無(wú)法使用“&”將它投入后臺(tái)運(yùn)行,但是可以先使用“Ctrl+z”組合鍵暫停該程序,然后在命令提示符下輸入“bg”命令,即可將該任務(wù)投入后臺(tái)執(zhí)行。如果要查看目前系統(tǒng)中正在運(yùn)行的后臺(tái)程序,可以使用jobs命令。6)輸入/輸出重定向在Linux系統(tǒng)中,標(biāo)準(zhǔn)輸入和輸出有3種形態(tài):標(biāo)準(zhǔn)輸入(stdin):通常是指鍵盤(pán)。標(biāo)準(zhǔn)輸出(stdout):通常是指將命令執(zhí)行的

17、結(jié)果輸出到終端機(jī)或屏幕上。標(biāo)準(zhǔn)錯(cuò)誤輸出(stderr):是指在命令發(fā)生錯(cuò)誤時(shí),將其錯(cuò)誤信息輸出到屏幕上。6.1 shell的簡(jiǎn)介 6.1.2 一般情況下,程序的輸入對(duì)象都是標(biāo)準(zhǔn)輸入,輸出是標(biāo)準(zhǔn)輸出。在Linux中提供了輸入(和和)的重新定向功能,它可以將程序的輸入和輸出由標(biāo)準(zhǔn)設(shè)備重定向到文件、打印機(jī)或其他裝置(/dev/null)。這里重定向(和和)是追加重定向,就是新的內(nèi)容將被添加到文件原來(lái)內(nèi)容的后面。例如,先使用ls命令查看/etc/pam目錄的內(nèi)容,然后將查看結(jié)果重定向到ls_result.txt文件中。其命令和執(zhí)行結(jié)果如圖所示。6.1 shell的簡(jiǎn)介 6.1.2 然后使用輸入重定向查

18、看ls_result.txt文件,可在命令提示符中輸入如下命令:rootmyhost root# cat 、|和!,還有以下可以在shell中使用的特殊字符。1)通配符(*和?)“*”和“?”是Linux系統(tǒng)中最常用的兩個(gè)通配符,在字符串查找的時(shí)候,通配符可以代替任意的字符。其中“?”可以代替一個(gè)任意字符,“*”可以代替任意多個(gè)字符。例如,執(zhí)行“l(fā)s l /root/test*”命令就會(huì)列出/root目錄下所有以test打頭的所有文件名,如下圖所示。6.1 shell的簡(jiǎn)介 6.1.2 2)命令取代符()命令取代符“”在Esc鍵下方,與“”符號(hào)在同一個(gè)鍵上。兩個(gè)“”符號(hào)包圍的命令,是該命令行中

19、首先被執(zhí)行的命令。例如,“echo date”命令,首先執(zhí)行date命令,然后使用echo來(lái)顯示date命令的結(jié)果,而不是顯示字符串date,如下圖所示。6.1 shell的簡(jiǎn)介 6.1.2 bash命令取代符“”的使用3)命令分隔符(;)如果需要執(zhí)行一連串的命令,可以一次輸入這些命令,而在命令間使用“;”分隔,Linux的shell會(huì)一次解釋并執(zhí)行這些命令。例如,在Linux的終端中,從/root目錄下先執(zhí)行cd /etc命令,然后再執(zhí)行more passwd命令來(lái)查看/etc/passwd文件的內(nèi)容,其過(guò)程如下圖所示。rootmyhost root# cd /etc ; more pass

20、wd6.1 shell的簡(jiǎn)介 6.1.2 bash命令分隔符“;”的使用4)注釋符(#)注釋符“#”通常使用在Linux的shell腳本程序或應(yīng)用程序的配置文件中,使用“#”開(kāi)頭的行為注釋行,shell在解釋該腳本程序的時(shí)候不會(huì)執(zhí)行該行。對(duì)于有經(jīng)驗(yàn)的程序員來(lái)說(shuō),注釋行的使用可以增加程序的可讀性,也可以使日后的維護(hù)更加簡(jiǎn)單。6.1 shell的簡(jiǎn)介 6.1.2 隨著Linux圖形界面的日益完善,依靠GNOME或KDE提供的圖形界面已經(jīng)能夠完成大部分基本的應(yīng)用。但是圖形界面的功能是有限的,只能完成一些可以預(yù)見(jiàn)的功能。例如,如果需要大批量地創(chuàng)建系統(tǒng)用戶,使用圖形界面是非常耗時(shí)的。此時(shí)就可以選擇使用s

21、hell腳本程序。Linux的shell程序是一個(gè)非常有用且很容易掌握的工具,可以幫助用戶輕松地完成繁重的任務(wù),提高使用和維護(hù)系統(tǒng)的效率。另外,Linux的圖形界面也是通過(guò)shell腳本解釋啟動(dòng)的,很多應(yīng)用程序本身就是一個(gè)shell程序。6.2創(chuàng)建和執(zhí)行shell程序shell程序與C語(yǔ)言等高級(jí)語(yǔ)言程序不同,shell程序是通過(guò)shell命令解釋器解釋執(zhí)行的,不生成二進(jìn)制的可執(zhí)行代碼,這一點(diǎn)和DOS下的批處理文件類(lèi)似。不同的shell解釋器對(duì)應(yīng)的shell程序的語(yǔ)法也不完全相同。由于bash是Linux下默認(rèn)提供的shell解釋器,并且bash也是使用最廣泛、與其他shell兼容性最好的解釋器

22、,因此下面介紹的shell程序的知識(shí)都是基于bash解釋器的。創(chuàng)建和執(zhí)行一個(gè)shell程序非常簡(jiǎn)單,一般需要以下3個(gè)步驟:(1)利用文本編輯器創(chuàng)建腳本內(nèi)容。(2)使用“chmod”命令設(shè)置腳本的可執(zhí)行屬性。(3)執(zhí)行腳本。6.2創(chuàng)建和執(zhí)行shell程序一個(gè)合法的shell腳本程序,都是以如下圖所示的shell解釋器聲明開(kāi)始的,即在shell程序的第一行。其中“#!”后面的“/bin/bash”,表示實(shí)際使用的解釋器。例如,以perl作為shell解釋器,則可以該聲明可以是“/usr/bin/perl”。6.2創(chuàng)建和執(zhí)行shell程序shell解釋器聲明注意:與其他行不同,這里前面雖然以“#”開(kāi)

23、頭,但不是注釋行。在5.3.4節(jié)中,我們介紹了使用Linux的命令批量建立用戶賬號(hào)的方法,下面以此應(yīng)用為例介紹如何創(chuàng)建和執(zhí)行shell腳本程序。1創(chuàng)創(chuàng)建shell程序在RedHat Linux 9的命令提示符下使用gedit addusers.sh或vi addusers.sh,創(chuàng)建文本文件addusers.sh.,在系統(tǒng)打開(kāi)的文本編輯窗口中輸入如下的語(yǔ)句(其中行首編號(hào)除外)。輸入完畢后保存退出。1 #!/bin/sh2 if -f $1 ; then3 if -f $2 ; then4 /usr/sbin/newusers $15 /usr/sbin/pwunconv6 /usr/sbin/

24、chpasswd $27 /usr/sbin/pwconv6.2創(chuàng)建和執(zhí)行shell程序8 echo the users add successfully!9 else10 echo the password file does not exist!11 exit 212 fi13else14 echo the username file does not exist!15 exit 116fi第一行表示這是一個(gè)shell腳本文件,其內(nèi)容由/bin/sh程序來(lái)解釋執(zhí)行。第二行到第八行表示當(dāng)該shell程序執(zhí)行時(shí),如果從命令行中接受的兩個(gè)文件存在,就執(zhí)行添加用戶的步驟,并給出“the users

25、 add successfully!”提示。否則給出文件不存在的提示。6.2創(chuàng)建和執(zhí)行shell程序2設(shè)設(shè)置addusers.sh文件的可執(zhí)執(zhí)行屬屬性addusers.sh文件編輯完畢并保存后,在命令提示符下執(zhí)行如下命令,設(shè)置其可執(zhí)行的屬性(假設(shè)addusers.sh文件保存在/root目錄下)。rootmyhost root# chmod a+x addusers.sh3執(zhí)執(zhí)行addusers.sh腳本shell腳本的執(zhí)行方法也很簡(jiǎn)單,只需要在命令提示符下輸入如下命令即可:rootmyhost root# ./ addusers.sh account.txt password.txt其中ac

26、count.txt是用戶賬號(hào)文件,password.txt是用戶口令文件。6.2創(chuàng)建和執(zhí)行shell程序在Linux的shell中使用的變量分為以下環(huán)境變量、內(nèi)部變量和用戶變量3類(lèi)。環(huán)境變量是Linux系統(tǒng)環(huán)境的一部分,通常不需要用戶去定義。shell使用環(huán)境變量來(lái)存儲(chǔ)系統(tǒng)信息,這些變量可以提供給在shell中執(zhí)行的程序使用,不同的shell會(huì)有不同的環(huán)境變量及其設(shè)置的方法。內(nèi)部變量是由系統(tǒng)提供的,用戶不能修改它們。用戶變量是用戶在編寫(xiě)shell腳本的時(shí)候定義的,可以在shell腳本中任意使用和修改。提示:如果希望一個(gè)用戶定義的變量能夠在定義它的shell腳本以外使用,就必須使用export命

27、令。例如,“export var”命令就是將用戶定義的變量var添加到系統(tǒng)變量列表中,這樣就可以在定義var變量腳本以外的地方使用。6.3 shell環(huán)境變量及設(shè)置文件 6.3.1 shell的環(huán)境變量的環(huán)境變量在Linux的bash中可以使用set命令來(lái)查看系統(tǒng)當(dāng)前的環(huán)境變量及其取值。如下圖所示。6.3 shell環(huán)境變量及設(shè)置文件 6.3.1 shell的環(huán)境變量的環(huán)境變量查看Linux的環(huán)境變量說(shuō)明:由于Linux的環(huán)境變量很多,這里利用管道符和tail命令與set命令結(jié)合只顯示系統(tǒng)環(huán)境變量的最后10個(gè)。若要查看當(dāng)前某個(gè)環(huán)境變量的值,可以使用echo命令,并在環(huán)境變量的前面加上“$”即可

28、。例如,查看當(dāng)前的命令主提示符,可以輸入如下命令: rootmyhost root# echo $PS1結(jié)果如下圖所示。6.3 shell環(huán)境變量及設(shè)置文件 6.3.1 shell的環(huán)境變量的環(huán)境變量查看環(huán)境變量PS1命令主提示符是Linux的shell程序?yàn)橛脩糨斎朊疃O(shè)置的提示符。環(huán)境變量PS1的值就是命令主提示符,默認(rèn)為“uh W$”,其中“”、“”和“”原樣顯示;“u”相應(yīng)位置顯示當(dāng)前登錄的用戶賬號(hào);“h”表示相應(yīng)位置顯示主機(jī)名;“W”相應(yīng)位置當(dāng)前工作目錄;“$”表示如果當(dāng)前登錄賬號(hào)是超級(jí)用戶就顯示“#”,如果是普通用戶就顯示“$”。例如,當(dāng)超級(jí)用戶登錄myhost主機(jī)時(shí),命令提示符

29、顯示為“rootmyhost root#”。環(huán)境變量PATH記錄了命令執(zhí)行時(shí)的默認(rèn)的搜索路徑,即當(dāng)用戶在命令提示符后輸入命令時(shí),Linux系統(tǒng)會(huì)按照PATH設(shè)置的路徑搜索該命令,然后再執(zhí)行該命令。PATH變量的值由多個(gè)路徑組成,各路徑之間使用“:”隔開(kāi)。6.3 shell環(huán)境變量及設(shè)置文件 6.3.1 shell的環(huán)境變量的環(huán)境變量6.3.2 shell配置文件配置文件用戶可以通過(guò)set命令來(lái)查看和設(shè)置常用的環(huán)境變量,但是在系統(tǒng)啟動(dòng)的時(shí)候,Linux并不是通過(guò)set命令來(lái)設(shè)置這些變量的,而是通過(guò)讀取相應(yīng)的shell配置文件來(lái)獲取環(huán)境變量的值的。在Linux的bash中其配置文件有全局的配置文件

30、,也有用戶個(gè)人的配置文件,shell在檢查這些文件的時(shí)候,遵循如下的順序:/etc/profile/.bashrc_profile/.bashrc/etc/bashrc。其中/etc/profile和/etc/bashrc文件中包含了全局環(huán)境變量的設(shè)置,/.bashrc_profile和/.bashrc文件中包含了個(gè)人環(huán)境變量的設(shè)置。6.3 shell環(huán)境變量及設(shè)置文件 6.3.2 shell配置文件配置文件1./etc/profile文件文件etc/profile文件是系統(tǒng)登錄時(shí)最先檢查執(zhí)行的shell配置文件,也是Linux系統(tǒng)最主要的shell配置文件,有關(guān)系統(tǒng)最重要的環(huán)境變量都在此定義

31、,如當(dāng)前系統(tǒng)的PATH、USER、LOGNAME、MAIL和HOSTNAME等。在該文件中還定義了每個(gè)shell所能執(zhí)行的程序的數(shù)目,即ulimit變量,以免shell過(guò)度占用系統(tǒng)資源。另外,在/etc/profile文件末尾會(huì)自動(dòng)執(zhí)行/etc/profile.d目錄下的所有*.sh腳本。2. /.bashrc_profile每個(gè)系統(tǒng)用戶的子目錄下都有一個(gè).bashrc_profile文件,用于設(shè)置每個(gè)用戶的bash環(huán)境變量,Linux系統(tǒng)啟動(dòng)時(shí),在讀取/etc/profile文件的內(nèi)容之后,就會(huì)檢查該文件。6.3 shell環(huán)境變量及設(shè)置文件 6.3.2 shell配置文件配置文件在該文件中

32、,首先讀取并執(zhí)行/.bashrc文件,然后設(shè)置PATH、BASH_ENV和USERNAME的值。此處的PATH變量的值,除了在全局環(huán)境配置文件/etc/profile文件中設(shè)置的PATH的值以外,還添加了用戶主目錄下的bin目錄。BASH_ENV的值則是接下來(lái)需要檢查的文件的名稱(chēng)。3. /.bashrc在讀取/.bashrc_profile文件的過(guò)程中,Linux會(huì)在執(zhí)行/.bashrc_profile文件的內(nèi)部中調(diào)用并執(zhí)行/.bashrc文件。另外,與前面兩個(gè)文件不同,Linux系統(tǒng)每次用戶登錄bash的時(shí)候都會(huì)讀取/.bashrc文件,并重新設(shè)置該文件中定義的環(huán)境變量。而/etc/prof

33、ile和/.bashrc_profile只在系統(tǒng)啟動(dòng)的時(shí)候才讀取。6.3 shell環(huán)境變量及設(shè)置文件 6.3.2 shell配置文件配置文件在/.bashrc文件中只定義了某些別名命令和虛擬終端的設(shè)置。例如,如果telnet登錄時(shí),無(wú)法瀏覽超過(guò)一頁(yè)的信息或文件內(nèi)容,此時(shí)可以在該文件中添加如下行:export TERM=vt100另外在該文件的最后還檢查/etc/bashrc文件是否存在,如果存在則轉(zhuǎn)而讀取并執(zhí)行該文件。4./etc/bashrc和/.bashrc文件一樣,用戶每次登錄Linux系統(tǒng)的時(shí)候,都會(huì)自動(dòng)讀取并執(zhí)行該文件。在該文件中設(shè)置了系統(tǒng)創(chuàng)建文件時(shí)默認(rèn)的文件存取權(quán)限的掩碼umas

34、k的值和用戶自定義的命令提示符PS1。6.3 shell環(huán)境變量及設(shè)置文件 6.3.2 shell配置文件配置文件除了上面介紹的常用的環(huán)境變量配置文件以外,還有/.bash_login、/.profile、/.bash_logout和/.bash_history文件,用于系統(tǒng)環(huán)境變量的定義。如果/.bash_profile文件不存在時(shí),系統(tǒng)會(huì)轉(zhuǎn)而讀取/.bashrc文件。該文件在每次用戶登錄時(shí)都會(huì)被bash讀取并執(zhí)行。通??梢詫⒂脩舻卿浐蟊仨殘?zhí)行的命令存放在這個(gè)文件中。如果/.bash_profile和/.bash_login文件都不存在的情況下,系統(tǒng)會(huì)使用/.profile文件中的內(nèi)容設(shè)置當(dāng)

35、前環(huán)境變量的值,其功能與/.bash_profile文件完全相同。Linux系統(tǒng)在注銷(xiāo)前,bash會(huì)讀取并執(zhí)行/.bash_logout。通常該文件中只有一個(gè)clear清屏命令。如果希望在系統(tǒng)注銷(xiāo)前執(zhí)行一些特定的任務(wù),就可以將相應(yīng)的命令行寫(xiě)入該文件。/.bash_history文件用于記錄當(dāng)前用戶在登錄系統(tǒng)后所執(zhí)行過(guò)的命令。6.3 shell環(huán)境變量及設(shè)置文件 6.3.2 shell配置文件配置文件shell腳本程序,簡(jiǎn)稱(chēng)shell腳本或shell程序,是使用系統(tǒng)提供的命令編寫(xiě)的文本文件,該文件具有可執(zhí)行的屬性,能夠幫助系統(tǒng)管理員自動(dòng)管理系統(tǒng)。在Linux的發(fā)行版本中就包含了很多的shell程

36、序,這些腳本有的是為了完成系統(tǒng)參數(shù)的設(shè)置,例如前面介紹的/etc/profile等文件;有的是為了完成某項(xiàng)系統(tǒng)服務(wù)的啟動(dòng)工作,例如/etc/rc.d/init.d目錄下的所有腳本。6.4.1 shell變量變量shell程序語(yǔ)法和其他高級(jí)語(yǔ)言程序類(lèi)似,包括變量、控制結(jié)構(gòu)和函數(shù)等。6.4 shell腳本編程 6.4.1 shell變量變量1.變量類(lèi)型與使用變量類(lèi)型與使用bash腳本是一種弱類(lèi)型的腳本語(yǔ)言。所謂弱類(lèi)型腳本語(yǔ)言,就是在bash腳本中,對(duì)類(lèi)型的要求不嚴(yán)格,同一個(gè)變量可以隨著使用場(chǎng)合的不同,存儲(chǔ)不同類(lèi)型的數(shù)據(jù)。弱類(lèi)型語(yǔ)言變量使用靈活,但是編程者需要注意對(duì)變量當(dāng)前存儲(chǔ)的數(shù)據(jù)類(lèi)型的檢查。1)

37、變量的聲明在bash中,變量的使用不需要顯式的聲明,或者說(shuō)賦值就可以認(rèn)為是變量的聲明。通常,給一個(gè)變量賦值應(yīng)采用如下的格式:變量名=值注意:等號(hào)兩邊不能存在分隔符(包括空格,制表位和回車(chē)符)。6.4 shell腳本編程 6.4.1 shell變量變量例如:a1=hellob1=902)變量的引用通常,要引用一個(gè)變量,可以采取在變量名前加一個(gè)$的方法,即“$變量名”。例如,要引用上面定義的變量a1可以采用如下的方法:echo a1 is $a1但是,有時(shí)候這種方法會(huì)產(chǎn)生混淆。例如,希望使用變量a1來(lái)輸入“hello Linux”字符串。如果使用echo “$a1Linux”就會(huì)得不到期待的字符。

38、這是因?yàn)閎ash把“a1Linux”作為一個(gè)變量來(lái)處理了。此時(shí)可以選擇使用以下的幾種用法(其中,value代表一個(gè)變量可能取的具體的值):6.4 shell腳本編程 6.4.1 shell變量變量$變量var:-value:如果指定的變量var存在,則返回var的值,否則返回value。$變量var:=value:如果指定的變量var存在,則返回var的值,否則先將value賦給var,然后再返回value。$變量var:+value:如果指定的變量var存在,則返回value,否則返回空值。$變量var:?value:如果指定的變量var存在,則返回該var的值,否則將錯(cuò)誤提示消息value

39、送到標(biāo)準(zhǔn)錯(cuò)誤輸出并退出shell程序。$變量var:offset:length:offset和length是整數(shù),中括號(hào)表示可選部分。表示返回從變量var的第offset+1個(gè)字符開(kāi)始長(zhǎng)度為length的子串。如果中括號(hào)部分省略,則表示返回變量var第offset+1個(gè)字符后面的子串。6.4 shell腳本編程 6.4.1 shell變量變量例6-1 演示bash中變量的使用。如圖下所示。各行的說(shuō)明如下:6.4 shell腳本編程 6.4.1 shell變量變量bash變量的使用rootmyhost root# var=hello定義變量var,并被賦值為“hello”rootmyhost r

40、oot# echo $var $title:-marry!hello marry!變量title在前面都沒(méi)有被賦值,所以$title:-marry返回“marry”。rootmyhost root# echo $var $title:+tom!hello !變量title仍然沒(méi)有被賦值,即不存在,所以$title:+tom返回空值。rootmyhost root# echo $var $title:?title is null or empty!bash: title: title is null or empty變量title仍然沒(méi)有被賦值,即不存在,所以$title:?title is n

41、ull or empty返回了錯(cuò)誤信息,即“bash: title: title is null or empty”。6.4 shell腳本編程 6.4.1 shell變量變量rootmyhost root# echo $var $title:=tom and marry!hello tom and marry!到此為止變量title仍然沒(méi)有被定義,所以title被賦值為“tom and marry”,并返回該值。rootmyhost root# echo $var $title:+somebody!hello somebody!此時(shí)變量title已經(jīng)存在,故返回“somebody”。root

42、myhost root# echo $var $title:8:5!hello marry!此處變量title已經(jīng)存在,且值為tom and marry,取其第9個(gè)字符,即“m”開(kāi)始后面5個(gè)字符,也就是“marry”。6.4 shell腳本編程 6.4.1 shell變量變量3)特殊變量在shell程序中存在一些特殊變量,當(dāng)shell程序運(yùn)行時(shí),這些變量能夠記錄shell程序的命令行參數(shù)。這些變量分別是$0、$1、$n,以及$#、$*和$。其中$0存放的是命令行的命令名,$1存放的是命令行中傳遞給命令的第一個(gè)參數(shù),依次類(lèi)推,$n存放的是傳遞給命令的第n個(gè)參數(shù)。$#存放傳遞給命令的參數(shù)的個(gè)數(shù)(不

43、包括命令),$*和$均用于存放傳遞給命令的所有參數(shù),兩者的區(qū)別在于$*把所有的參數(shù)作為一個(gè)整體,而$則把所有的參數(shù)看作是類(lèi)似于字符串?dāng)?shù)組一樣,可以單獨(dú)訪問(wèn)這些參數(shù)。2. shell表達(dá)式表達(dá)式和高級(jí)程序語(yǔ)言一樣,shell程序的表達(dá)式由運(yùn)算符和參加運(yùn)算的操作數(shù)構(gòu)成。操作數(shù)通??梢允亲兞?、常量。6.4 shell腳本編程 6.4.1 shell變量變量1)shell的運(yùn)算符shell的運(yùn)算符的使用規(guī)則都與C語(yǔ)言非常類(lèi)似。2)shell表達(dá)式利用運(yùn)算符將變量或常量連接起來(lái)就構(gòu)成了表達(dá)式。但是由于在bash中變量和常量沒(méi)有特定的數(shù)據(jù)類(lèi)型,因此在bash中單純使用一個(gè)表達(dá)式作為命令或語(yǔ)句是錯(cuò)誤的,而必

44、須使用expr或let命令來(lái)指明表達(dá)式是一個(gè)運(yùn)算式。expr命令會(huì)先求出表達(dá)式的值,然后送到標(biāo)準(zhǔn)輸出顯示。let命令會(huì)先求出表達(dá)式的值,然后賦值給一個(gè)變量,而不顯示在標(biāo)準(zhǔn)輸出上。expr和let命令的使用方法如下:expr let 表達(dá)式2 .6.4 shell腳本編程 6.4.1 shell變量變量expr命令一次攜帶一個(gè)表達(dá)式,let命令一次可以攜帶多個(gè)表達(dá)式。在expr命令的表達(dá)式中使用了數(shù)值運(yùn)算,此時(shí)需要用空格將數(shù)字運(yùn)算符與操作數(shù)分隔開(kāi)。另外,如果表達(dá)式中的運(yùn)算符是“”、“&”、“*”及“|”等特殊符號(hào),需要使用雙引號(hào)、單引號(hào)括起來(lái),或?qū)⒎葱备埽ǎ┓旁谶@些符號(hào)的前面。而let命

45、令中的多個(gè)表達(dá)式之間需要空格隔開(kāi),而表達(dá)式內(nèi)部無(wú)需使用空格。例如如下幾個(gè)表達(dá)式:expr 3+2操作數(shù)3、2和運(yùn)算符+之間沒(méi)有空格,此時(shí)bash不會(huì)報(bào)錯(cuò),而是把3+2作為字符串來(lái)處理。expr 3 + 2操作數(shù)3、2和運(yùn)算符+之間有空格,此時(shí)bash認(rèn)為是數(shù)字運(yùn)算,返回5送到標(biāo)準(zhǔn)輸出設(shè)備。6.4 shell腳本編程 6.4.1 shell變量變量expr 3*2使用雙引號(hào)將操作符*括起,此時(shí)bash返回乘積6。let s=(2+3)*4s結(jié)果為5*4=20。3條件判斷條件判斷在編寫(xiě)程序的時(shí)候,經(jīng)常需要根據(jù)某個(gè)條件的測(cè)試進(jìn)行程序執(zhí)行分支的選擇。這里的條件可能是某個(gè)表達(dá)式的值、文件的存取權(quán)限、某段

46、代碼的執(zhí)行結(jié)果,或者是多個(gè)條件結(jié)果按照邏輯運(yùn)算后的值。條件測(cè)試的結(jié)果只有真或假2種。需要注意的是,這里“真”的數(shù)值表示為0,“假”的數(shù)值表示為非0,與表達(dá)式的真值以及C語(yǔ)言的真值剛好相反。6.4 shell腳本編程 6.4.1 shell變量變量在bash中條件測(cè)試的使用方法是,利用test命令或一對(duì)中括號(hào)包含條件測(cè)試表達(dá)式,這兩種方法是等價(jià)的。它們的格式如下:test cond_expr或 cond_expr 注意:利用一對(duì)中括號(hào)時(shí),左右的中括號(hào)與表達(dá)式之間都必須存在空格。cond_expr是需要測(cè)試的條件表達(dá)式,可以是以下幾種情況:(1)文件存取屬性測(cè)試:包括文件類(lèi)型,文件的訪問(wèn)權(quán)限等。(

47、2)字符串屬性測(cè)試,包括字符串長(zhǎng)度,內(nèi)容等。(3)整數(shù)關(guān)系測(cè)試,包括大小比較,相等判斷等。(4)上述3種關(guān)系通過(guò)邏輯運(yùn)算(與、或、非)的組合。6.4 shell腳本編程 6.4.1 shell變量變量例6-2 練習(xí)使用文件測(cè)試命令。利用shell提供的文件測(cè)試命令,測(cè)試文件的屬性,如下圖所示。6.4 shell腳本編程 6.4.1 shell變量變量文件屬性測(cè)試首先使用test命令測(cè)試test.sh是否存在其可寫(xiě),從ls l命令返回的結(jié)果看,確實(shí)是test.sh文件存在且可寫(xiě)的,所以“echo $?”命令返回0表示真。然后又使用中括號(hào)測(cè)試tdir是不是目錄以及是否可寫(xiě),從ls l命令的返回來(lái)看

48、,tdir同樣是目錄且可寫(xiě)的,所以返回真。其中“$?”表示引用變量“?”,而變量“?”是一個(gè)特殊變量,可以返回緊鄰的前驅(qū)命令的返回值。例6-3練習(xí)使用字符串測(cè)試命令利用shell提供的字符串測(cè)試命令,字符串測(cè)試,如下圖所示。6.4 shell腳本編程 6.4.1 shell變量變量字符串測(cè)試?yán)惺紫榷x了root_home變量,值為/root,變量tom_home,值為/home/tom,然后測(cè)試這兩個(gè)字符串變量的值是否相等,結(jié)果為1表示不相等。例6-4練習(xí)使用數(shù)值關(guān)系測(cè)試命令。數(shù)值關(guān)系測(cè)試,如下圖所示。6.4 shell腳本編程 6.4.1 shell變量變量數(shù)值關(guān)系測(cè)試首先定義變量var1

49、,值為200,變量var2,值為300,接著測(cè)試var1的值是否等于var2的值。返回值為1,表示這兩個(gè)變量不等。然后又測(cè)試var1是否小于var2,返回值為0,表示var1的值小于var2。6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu)shell程序的控制結(jié)構(gòu)是用于改變shell程序執(zhí)行流程的結(jié)構(gòu)。在shell程序的執(zhí)行過(guò)程中可以根據(jù)某個(gè)條件的測(cè)試值,來(lái)選擇程序執(zhí)行的路徑。在shell程序中,控制結(jié)構(gòu)可以簡(jiǎn)單地分為分支和循環(huán)結(jié)構(gòu)2類(lèi)。bash支持的分支結(jié)構(gòu)有if結(jié)構(gòu)和case結(jié)構(gòu),支持的循環(huán)結(jié)構(gòu)有for結(jié)構(gòu)、while結(jié)構(gòu)和until結(jié)構(gòu)。它們的使用方法與C語(yǔ)言等高級(jí)程序設(shè)計(jì)語(yǔ)言中相應(yīng)的結(jié)構(gòu)類(lèi)似。6

50、.4 shell腳本編程 6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu)1.if分支結(jié)構(gòu)分支結(jié)構(gòu)if結(jié)構(gòu)是最常用的分支結(jié)構(gòu),其格式如下:if 條件測(cè)試1 ;thencommand_list_1elif 條件測(cè)試2 ; thencommand_list_2 elsecommand_list_3 fi6.4 shell腳本編程 6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu)其中,中括號(hào)部分為可選部分。當(dāng)“條件測(cè)試1”為真時(shí),執(zhí)行command_list_1,否則如果存在elif語(yǔ)句,則測(cè)試“條件測(cè)試2”,如果為真,執(zhí)行command_list_2。如果elif語(yǔ)句不存在或“條件測(cè)試2為假,則執(zhí)行command_l

51、ist_3。條件測(cè)試部分一般可以是test或修飾的條件表達(dá)式。例6-5 根據(jù)用戶輸入的目錄名稱(chēng)判斷該目錄是否存在,如果存在則進(jìn)入該目錄,否則測(cè)試同名文件是否存在,如果存在,則退出shell程序,否則新建同名目錄,并進(jìn)入該目錄。#!/bin/bash#an example script of ifclearecho input a directory name, please!6.4 shell腳本編程 6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu)read dir_name#測(cè)試$dir_name目錄是否存在if d $dir_name ;thencd $dir_name /dev/null 2$1e

52、cho $dir_name has already existed,enter directory succeed#測(cè)試是否存在與$dir_name同名的文件elif -f $dir_name ; thenecho file: $dir_name has already existed,create directory failedexit6.4 shell腳本編程 6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu)elsemkdir $dir_name /dev/null 2$1cd $dir_nameecho $dir_name has not existed,create and enter dir

53、ectory succeedfi在該例中,“cd $dir_name /dev/null 2$1”表示cd命令可能產(chǎn)生的標(biāo)準(zhǔn)輸出信息和標(biāo)準(zhǔn)錯(cuò)誤輸出信息重定向的到一個(gè)空設(shè)備/dev/null,從而實(shí)現(xiàn)隱藏cd命令錯(cuò)誤輸出的功能?!癿kdir $dir_name /dev/null 2$1”命令行的作用類(lèi)似。由于Linux不允許在同一目錄下存在同名的文件和目錄,所有如果$dir_name不存在時(shí),還要測(cè)試是否有同名的文件存在,然后才能新建該目錄。6.4 shell腳本編程 6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu)注意:then命令可以和if結(jié)構(gòu)寫(xiě)在同一行,但是如果then命令和if結(jié)構(gòu)在同一行時(shí),t

54、hen命令的前面一定要有一個(gè)分號(hào),且分號(hào)與條件測(cè)試表達(dá)式之間用空格隔開(kāi)。2.case分支結(jié)構(gòu)分支結(jié)構(gòu)if結(jié)構(gòu)用于存在兩種分支選擇的情況下,當(dāng)程序存在多個(gè)分支的選擇時(shí),如果使用if結(jié)構(gòu),就必須使用多個(gè)elif結(jié)構(gòu),從而使得程序的結(jié)構(gòu)冗余,此時(shí)可以選在使用case結(jié)構(gòu)。case結(jié)構(gòu)可以幫助程序靈活地完成多路分支的選擇,而且程序結(jié)構(gòu)直觀、簡(jiǎn)潔。case分支結(jié)構(gòu)的格式如下:case expr模式1 )6.4 shell腳本編程 6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu)command_list_1 ; 模式2 )command_list_2;* )command_list_n; esac其中,expr可以

55、是變量、表達(dá)式或shell命令等,模式為expr的取值。通常一個(gè)模式可以是expr的多種取值,使用或(|)連接。模式中還可以使用通配符,星號(hào)(*)表示匹6.4 shell腳本編程 6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu)配任意字符值,問(wèn)號(hào)(?)表示匹配任意一個(gè)字符,.可以匹配某個(gè)范圍內(nèi)的字符。在case分支結(jié)構(gòu)中,首先計(jì)算expr的值,然后根據(jù)求得的值查找匹配的模式,接著執(zhí)行對(duì)應(yīng)模式后面的命令序列,執(zhí)行完成后,退出case結(jié)構(gòu)。需要注意的是,在case結(jié)構(gòu)的命令序列后面需要使用雙分號(hào)(;)分隔下一個(gè)模式。例6-5 使用case語(yǔ)句編寫(xiě)程序,根據(jù)上網(wǎng)地址的不同為計(jì)算機(jī)設(shè)置不同的IP地址參數(shù)。#!/

56、bin/bash#an example script of caseclearecho please enter current location(home,h,H,office,o,O):6.4 shell腳本編程 6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu)read nettypecase $nettype in home|h|H ) /sbin/ifconfig eth0 18 netmask /sbin/route add default gw ; office|o|O) /sbin/ifconfig eth0 192

57、.168.1.58 netmask /sbin/route add default gw ;6.4 shell腳本編程 6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu) *) echo input error! exit ;esacecho “Success!”本例程中,如果用戶輸入home、h或H則表示上網(wǎng)地點(diǎn)是在家中,此時(shí)IP地址為18,網(wǎng)絡(luò)掩碼為24,默認(rèn)網(wǎng)關(guān)為。如果用戶輸入office、o或O則表示上網(wǎng)地點(diǎn)是在辦公室內(nèi),此時(shí)IP地址為18,網(wǎng)絡(luò)掩碼為24,默認(rèn)網(wǎng)關(guān)為192.168

58、.1.1。其他的輸入無(wú)效,并給出提示“input error!”。其中ifconig和route命令在后面的章節(jié)中將詳細(xì)介紹。6.4 shell腳本編程 6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu)3.for循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)for循環(huán)用于預(yù)先知道循環(huán)執(zhí)行次數(shù)的程序段中,它是最常用的循環(huán)結(jié)構(gòu)之一。for的格式如下:for var in value_list docommand_listdone其中,value_list是變量var需要取到的值,隨著循環(huán)的執(zhí)行,變量var需要依次從value_list中的第一個(gè)值,取到最后一個(gè)值。do和done結(jié)構(gòu)之間的command_list是循環(huán)需要執(zhí)行的命令序列,

59、變量var每取一個(gè)值都會(huì)循環(huán)執(zhí)行一次command_list中的命令。同樣中括號(hào)部分為可選部分,如果省略了該部分,bash會(huì)從命令行參數(shù)中為var取值,即等同于“in $”。6.4 shell腳本編程 6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu)例6-6 使用for語(yǔ)句編寫(xiě)程序,向系統(tǒng)添加10個(gè)用戶,其名稱(chēng)分別是student1、student2、student10。#!/bin/bash# an example script of forfor i in 1 10 doif -d /home/student$i ; thenecho the directory /home/student$i ex

60、ist.e c h o t h e c o n t e n t o f d i r e c t o r y /home/student$i is moved to /home/stu$imv student$i stu$i6.4 shell腳本編程 6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu)fiadduser student$i /dev/null 2$1echo student$i |passwd usr$i$j -stdinecho user add succeed,the home directory is: /home/student$idone由于在Linux中adduser命令會(huì)在/home目錄下創(chuàng)建與用戶

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論