版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Linux操作系統(tǒng)實用教程第6章 Red Hat Linux 9的shell程序 6.1 shell簡介 6.2 創(chuàng)建和執(zhí)行shell程序 6.3 shell環(huán)境變量及設(shè)置文件 6.4 shell腳本編程 6.5 shell程序跟蹤本章概述本章概述Shell的原意是外殼,用來形容物體外部架構(gòu)。各種操作系統(tǒng)都有自己的shell,在DOS系統(tǒng)中,它的shell就是程序,而Windows操作系統(tǒng)的程序shell是explorer.exe程序。與Windows等操作系統(tǒng)不同,Linux系統(tǒng)中將shell獨立于操作系統(tǒng)核心程序之外,使得用戶可以在不影響操作系統(tǒng)本身的情況下進行修改,更新版本或添加新的功能
2、。第6章 Red Hat Linux 9的shell程序操作系統(tǒng)的shell程序,介于用戶和操作系統(tǒng)內(nèi)核(Kernel)之間,負責(zé)將用戶的命令解釋成操作系統(tǒng)可以接受的指令,然后由操作系統(tǒng)來執(zhí)行這些指令,并將操作系統(tǒng)執(zhí)行的結(jié)果以用戶可以了解的方式反饋給用戶。6.1.1 shell及shell編編程在Linux系統(tǒng)中,shell是操作系統(tǒng)的外殼,為用戶提供使用操作系統(tǒng)的接口,它是命令語言、命令解釋程序和程序設(shè)計語言的統(tǒng)稱。shell是用戶和操作系統(tǒng)之間的一個接口。用戶在命令提示符下輸入的每個命令都首先由shell程序進行解釋,然后再傳給Linux內(nèi)核的。 6.1 shell的簡介 6.1.1 sh
3、ell及及shell編程編程shell是一個命令解釋器。它擁有自己內(nèi)建的shell命令集,可以用它來啟動、掛起、停止一些程序。此外shell也能被系統(tǒng)中的其他有效的Linux應(yīng)用程序所調(diào)用。shell還是一個解釋型的程序設(shè)計語言。shell程序設(shè)計語言支持絕大多數(shù)高級程序設(shè)計語言中常用的元素,比如函數(shù)、變量、數(shù)組和控制結(jié)構(gòu)。shell編程簡單易學(xué),在任何命令提示符中能鍵入的命令都可以在shell程序中使用。而且一旦掌握,它將成為工作中的得力工具。和DOS和Windows不同,Linux提供了多種shell程序供用戶選擇使用,使用不同類型shell的原因是它們都有各自的特點。一般某個用戶登錄系統(tǒng)
4、時的shell都在/etc/passwd6.1 shell的簡介 6.1.1 shell及及shell編程編程文件的最后一個字段中定義,用戶可以通過修改該字段來替換其使用的shell。另外,用戶在文本模式下登錄系統(tǒng)后,Linux的初始化程序initd就會為每個用戶啟動一個shell,可以使用“Alt+F1F6”來獲取shell提供的多個虛擬控制臺,使用虛擬控制臺的最大好處就是,當(dāng)一個虛擬控制臺上的程序由于出錯給鎖住輸入時,用戶可以進入另一個虛擬控制臺,然后殺死該進程。如果系統(tǒng)使用了X Window的圖形模式,那么虛擬終端的切換就要使用“Ctrl+Alt+F1F6”。6.1 shell的簡介 6
5、.1.1 shell及及shell編程編程6.1.2 bash在Linux中,用戶可以選擇使用多種不同類型的shell。在RedHat Linux 9的/etc/shells文件中,列出了目前系統(tǒng)可以使用的shell。并且給出了這些shell程序的位置。具體如下圖所示。6.1 shell的簡介 6.1.2 bashRedHat Linux 9中的shell最常用的幾種shell是Bourne shell(sh)、C shell(csh)、Ash shell(ash)、Korn shell(ksh)和Bourne Again shell(bash)等。每種shell都有自己的特點,一般的Linu
6、x系統(tǒng)默認使用bash。1bash簡簡介Bourne shell是最早被大量使用及標準化的shell,幾乎所有的Linux都支持它。它是由貝爾實驗室開發(fā)的,由于開發(fā)者是Steven Bourne,所以被命名為“Bourne shell”。Bourne Again shell(bash)是Bourne shell的擴展,與Bourne shell完全兼容,并且在其基礎(chǔ)上增加和增強了很多功能。其中包括了很多csh和ksh的優(yōu)點。bash不僅有非常靈活和強大的編程接口,同時又有非常友好的用戶界面。它內(nèi)建40個shell命令和12個命令行參數(shù)。目前bash6.1 shell的簡介 6.1.2 bash
7、是大多數(shù)Linux默認的shell,RedHat Linux 9也默認使用bash。bash有許多特色,可以使用方向鍵查閱以前輸入的命令,即history功能??梢詫γ钚羞M行編輯,甚至可以在忘記了命令名時請求shell通過命令行補齊進行幫助,方法就是在敲入命令的一部分時,再按下Tab鍵即可。例如,在命令行提示符下輸入ls,再按下“Tab”鍵,bash會幫助用戶列出所有以“l(fā)s”打頭的命令名,供用戶選擇。如圖下所示。6.1 shell的簡介 6.1.2 bashbash的命令行補齊bash也內(nèi)建了幫助功能,可以給出所有內(nèi)建命令和每個系統(tǒng)命令的幫助信息??梢允褂谩癶elp ”的方法獲得指定命令的
8、幫助信息。在RedHat Linux 9中環(huán)境表變量SHELL記錄了系統(tǒng)當(dāng)前使用的shell程序的名稱,可以通過返回環(huán)境變量SHELL的值來查看當(dāng)前系統(tǒng)使用的shell程序,如圖下所示。6.1 shell的簡介 6.1.2 bash查看系統(tǒng)當(dāng)前的shell2bash的功能shell是操作系統(tǒng)的外殼。RedHat Linux 9中默認使用的shell是bash,它為用戶提供使用操作系統(tǒng)的接口,承擔(dān)著用戶與操作系統(tǒng)內(nèi)核之間進行溝通的任務(wù)。除此之外,bash程序還兼?zhèn)淙缦碌墓δ埽?)交互式處理從用戶登錄系統(tǒng)開始,shell程序就是在系統(tǒng)終端中顯示不同的命令行提示符(root用戶登錄系統(tǒng)則提示符顯示“
9、#”,普通用戶登錄則顯示“$”),然后等待用戶輸入命令。在接收來自用戶輸入的命令后,bash會根據(jù)命令的不同的類型(包括程序或shell內(nèi)置命令)來執(zhí)行,在執(zhí)行完畢后,bash將結(jié)果回傳給用戶,并且再次回到命令提示符,以等待用戶的下一次輸入。這種模式會一直繼續(xù)下去,直6.1 shell的簡介 6.1.2 bash到用戶執(zhí)行exit或是按下Ctrl+D來注銷,bash才會結(jié)束,bash的這種與用戶溝通的方式稱為“交互式處理”。2)命令補全功能所謂“命令補全”是指在用戶輸入命令的時候,無需輸入完整的命令行,Linux系統(tǒng)的shell會自動查找出最符合的命令名稱,供用戶選擇。這樣的功能可以幫用戶節(jié)省
10、輸入長串命令的時間。例如,在/root目錄下有一個testexecvp.c文件,如果想查看其中的內(nèi)容,并不需要完整輸入該文件的名稱,而只要輸入開頭的幾個字母,即輸入“more /root/teste”,然后按下Tab鍵一次,Linux的bash會自動補足完整的命令(more /root/testexecvp.c)。6.1 shell的簡介 6.1.2 bash另一種情況就是,如果系統(tǒng)中有多個文件都與輸入的前綴相同,那么當(dāng)用戶連續(xù)按下2次Tab鍵時,系統(tǒng)會顯示當(dāng)前目錄下所有具有相同前綴的文件名稱,供用戶選擇。例如,輸入“more test”后按2次Tab鍵,結(jié)果如圖下所示。6.1 shell的簡
11、介 6.1.2 bashbash的補齊功能shell的補全功能,不但方便,而且可以避免由于用戶輸入錯誤的路徑而執(zhí)行錯誤的程序。3)查閱歷史記錄history命令在RedHat Linux 9中,每當(dāng)用戶輸入的命令并按下Enter后,都會被記錄在命令記錄表中,默認情況下,bash默認使用的命令記錄表文件為用戶主目錄下的.bash_history(文件名前面的“.”表示這是一個隱藏文件)文件??梢允褂铆h(huán)境變量HISTSIZE來定義命令記錄表的條數(shù),默認的記錄條數(shù)為1000條。6.1 shell的簡介 6.1.2 bash在RedHat Linux 9中可以直接瀏覽.bash_history文件,或
12、使用history命令來查看目前的命令記錄。如下圖所示。6.1 shell的簡介 6.1.2 bashbash的補齊功能系統(tǒng)提供的history命令可以列出完整的系統(tǒng)在該用戶登錄時執(zhí)行過的所有命令,并以命令執(zhí)行的先后順序列出記錄的號碼。如果要查看最近執(zhí)行的命令,則可以使用“history n”命令,其中,n表示需要查看的最近執(zhí)行的命令的條數(shù)。如下圖所示,列出系統(tǒng)最近執(zhí)行的10條命令。6.1 shell的簡介 6.1.2 bash查看最近的10條命令記錄bash的history功能提供了一種執(zhí)行命令的最快的方法,就是使用命令記錄號碼。在RedHat Linux 9的命令記錄中,每條用戶執(zhí)行過的命
13、令都會被賦一個記錄號碼,用戶可以利用這些記錄號碼來執(zhí)行指定的要執(zhí)行的舊命令。其語法如下:!例如,要執(zhí)行478條記錄標記的命令,可以在命令行提示符下執(zhí)行如下:rootmyhost root# !478結(jié)果如右圖所示。6.1 shell的簡介 6.1.2 bash使用!執(zhí)行命令4)別名(alias)功能Linux中的別名功能是指提供給用戶使用自定義的簡單字符串,來替換復(fù)雜的命令選項,或是替換連續(xù)多個命令的連續(xù)組合的功能,從而使得用戶可以自定義符合自己習(xí)慣的操作命令。例如,對于熟悉DOS和Windows的用戶來說,dir命令可以方便地顯示當(dāng)前目錄的內(nèi)容,但是在Linux中完成該功能的命令是“l(fā)s l
14、”。如果希望使用dir來代替ls l,則可以使用alias功能來創(chuàng)建一個到ls l的別名,如下圖所示。6.1 shell的簡介 6.1.2 bashbash的alias功能如果希望查看當(dāng)前Linux系統(tǒng)中使用的別名命令,可以直接輸入“alias”命令。如果需要取消特定的別名命令,可以使用unalias命令。例如,取消dir別名命令可使用如下命令。rootmyhost root# unalias dir使用alias命令查看并取消別名命令的結(jié)果如下圖所示。6.1 shell的簡介 6.1.2 bash查看并取消別名命令5)后臺處理Linux是多用戶多任務(wù)的操作系統(tǒng),它允許多個用戶同時登錄系統(tǒng),也
15、允許多個程序同時執(zhí)行。但因為shell使用交互式模式,目前執(zhí)行的命令會一直掌握系統(tǒng)的控制權(quán),直到該程序結(jié)束為止,這類程序稱為前臺程序(Foreground)。shell采用的這種前臺程序接管系統(tǒng)控制權(quán)的模式,使得個別用戶無法使用Linux提供的多任務(wù)功能來增加效率,因此,shell提供了后臺處理功能來解決上述問題。6.1 shell的簡介 6.1.2 bash通常,Linux后臺運行的都是比較耗時的程序,如編譯核心或是下載Linux的安裝文件等,但是后臺任務(wù)在執(zhí)行期間,用戶仍然可以和shell繼續(xù)交互,以下達其他的命令。要在RedHat Linux 9中要執(zhí)行后臺程序,只要在輸入命令的時候,在
16、命令后面加上“&”符號。系統(tǒng)就會開始以后臺的方式執(zhí)行該命令,屏幕將顯示該后臺運行程序的進程PID,然后shell將回到命令提示符狀態(tài),以等待用戶的下一個命令的輸入。例如,將top命令投入后臺運行。如下圖所示。6.1 shell的簡介 6.1.2 bash后臺運行top當(dāng)前某個任務(wù)在前臺運行之后,就無法使用“&”將它投入后臺運行,但是可以先使用“Ctrl+z”組合鍵暫停該程序,然后在命令提示符下輸入“bg”命令,即可將該任務(wù)投入后臺執(zhí)行。如果要查看目前系統(tǒng)中正在運行的后臺程序,可以使用jobs命令。6)輸入/輸出重定向在Linux系統(tǒng)中,標準輸入和輸出有3種形態(tài):標準輸入(std
17、in):通常是指鍵盤。標準輸出(stdout):通常是指將命令執(zhí)行的結(jié)果輸出到終端機或屏幕上。標準錯誤輸出(stderr):是指在命令發(fā)生錯誤時,將其錯誤信息輸出到屏幕上。6.1 shell的簡介 6.1.2 bash一般情況下,程序的輸入對象都是標準輸入,輸出是標準輸出。在Linux中提供了輸入(和和)的重新定向功能,它可以將程序的輸入和輸出由標準設(shè)備重定向到文件、打印機或其他裝置(/dev/null)。這里重定向(和和)是追加重定向,就是新的內(nèi)容將被添加到文件原來內(nèi)容的后面。例如,先使用ls命令查看/etc/pam目錄的內(nèi)容,然后將查看結(jié)果重定向到ls_result.txt文件中。其命令和
18、執(zhí)行結(jié)果如圖所示。6.1 shell的簡介 6.1.2 bash然后使用輸入重定向查看ls_result.txt文件,可在命令提示符中輸入如下命令:rootmyhost root# cat 、|和!,還有以下可以在shell中使用的特殊字符。1)通配符(*和?)“*”和“?”是Linux系統(tǒng)中最常用的兩個通配符,在字符串查找的時候,通配符可以代替任意的字符。其中“?”可以代替一個任意字符,“*”可以代替任意多個字符。例如,執(zhí)行“l(fā)s l /root/test*”命令就會列出/root目錄下所有以test打頭的所有文件名,如下圖所示。6.1 shell的簡介 6.1.2 bash2)命令取代符(
19、)命令取代符“”在Esc鍵下方,與“”符號在同一個鍵上。兩個“”符號包圍的命令,是該命令行中首先被執(zhí)行的命令。例如,“echo date”命令,首先執(zhí)行date命令,然后使用echo來顯示date命令的結(jié)果,而不是顯示字符串date,如下圖所示。6.1 shell的簡介 6.1.2 bash命令取代符“”的使用3)命令分隔符(;)如果需要執(zhí)行一連串的命令,可以一次輸入這些命令,而在命令間使用“;”分隔,Linux的shell會一次解釋并執(zhí)行這些命令。例如,在Linux的終端中,從/root目錄下先執(zhí)行cd /etc命令,然后再執(zhí)行more passwd命令來查看/etc/passwd文件的內(nèi)容
20、,其過程如下圖所示。rootmyhost root# cd /etc ; more passwd6.1 shell的簡介 6.1.2 bash命令分隔符“;”的使用4)注釋符(#)注釋符“#”通常使用在Linux的shell腳本程序或應(yīng)用程序的配置文件中,使用“#”開頭的行為注釋行,shell在解釋該腳本程序的時候不會執(zhí)行該行。對于有經(jīng)驗的程序員來說,注釋行的使用可以增加程序的可讀性,也可以使日后的維護更加簡單。6.1 shell的簡介 6.1.2 bash隨著Linux圖形界面的日益完善,依靠GNOME或KDE提供的圖形界面已經(jīng)能夠完成大部分基本的應(yīng)用。但是圖形界面的功能是有限的,只能完成一
21、些可以預(yù)見的功能。例如,如果需要大批量地創(chuàng)建系統(tǒng)用戶,使用圖形界面是非常耗時的。此時就可以選擇使用shell腳本程序。Linux的shell程序是一個非常有用且很容易掌握的工具,可以幫助用戶輕松地完成繁重的任務(wù),提高使用和維護系統(tǒng)的效率。另外,Linux的圖形界面也是通過shell腳本解釋啟動的,很多應(yīng)用程序本身就是一個shell程序。6.2創(chuàng)建和執(zhí)行shell程序shell程序與C語言等高級語言程序不同,shell程序是通過shell命令解釋器解釋執(zhí)行的,不生成二進制的可執(zhí)行代碼,這一點和DOS下的批處理文件類似。不同的shell解釋器對應(yīng)的shell程序的語法也不完全相同。由于bash是L
22、inux下默認提供的shell解釋器,并且bash也是使用最廣泛、與其他shell兼容性最好的解釋器,因此下面介紹的shell程序的知識都是基于bash解釋器的。創(chuàng)建和執(zhí)行一個shell程序非常簡單,一般需要以下3個步驟:(1)利用文本編輯器創(chuàng)建腳本內(nèi)容。(2)使用“chmod”命令設(shè)置腳本的可執(zhí)行屬性。(3)執(zhí)行腳本。6.2創(chuàng)建和執(zhí)行shell程序一個合法的shell腳本程序,都是以如下圖所示的shell解釋器聲明開始的,即在shell程序的第一行。其中“#!”后面的“/bin/bash”,表示實際使用的解釋器。例如,以perl作為shell解釋器,則可以該聲明可以是“/usr/bin/pe
23、rl”。6.2創(chuàng)建和執(zhí)行shell程序shell解釋器聲明注意:與其他行不同,這里前面雖然以“#”開頭,但不是注釋行。在5.3.4節(jié)中,我們介紹了使用Linux的命令批量建立用戶賬號的方法,下面以此應(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)打開的文本編輯窗口中輸入如下的語句(其中行首編號除外)。輸入完畢后保存退出。1 #!/bin/sh2 if -f $1 ; then3 if -f $2 ; then4 /us
24、r/sbin/newusers $15 /usr/sbin/pwunconv6 /usr/sbin/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第一行表示這是一個shell腳本文件,其內(nèi)容由/bin/sh程序來解釋執(zhí)行。第二行到第八行表示當(dāng)該sh
25、ell程序執(zhí)行時,如果從命令行中接受的兩個文件存在,就執(zhí)行添加用戶的步驟,并給出“the users 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í)行方法也很簡單,只需要在命令提示符下輸入如下命令即可:rootmyhost
26、 root# ./ addusers.sh account.txt password.txt其中account.txt是用戶賬號文件,password.txt是用戶口令文件。6.2創(chuàng)建和執(zhí)行shell程序在Linux的shell中使用的變量分為以下環(huán)境變量、內(nèi)部變量和用戶變量3類。環(huán)境變量是Linux系統(tǒng)環(huán)境的一部分,通常不需要用戶去定義。shell使用環(huán)境變量來存儲系統(tǒng)信息,這些變量可以提供給在shell中執(zhí)行的程序使用,不同的shell會有不同的環(huán)境變量及其設(shè)置的方法。內(nèi)部變量是由系統(tǒng)提供的,用戶不能修改它們。用戶變量是用戶在編寫shell腳本的時候定義的,可以在shell腳本中任意使用和
27、修改。提示:如果希望一個用戶定義的變量能夠在定義它的shell腳本以外使用,就必須使用export命令。例如,“export var”命令就是將用戶定義的變量var添加到系統(tǒng)變量列表中,這樣就可以在定義var變量腳本以外的地方使用。6.3 shell環(huán)境變量及設(shè)置文件 6.3.1 shell的環(huán)境變量的環(huán)境變量在Linux的bash中可以使用set命令來查看系統(tǒng)當(dāng)前的環(huán)境變量及其取值。如下圖所示。6.3 shell環(huán)境變量及設(shè)置文件 6.3.1 shell的環(huán)境變量的環(huán)境變量查看Linux的環(huán)境變量說明:由于Linux的環(huán)境變量很多,這里利用管道符和tail命令與set命令結(jié)合只顯示系統(tǒng)環(huán)境變
28、量的最后10個。若要查看當(dāng)前某個環(huán)境變量的值,可以使用echo命令,并在環(huán)境變量的前面加上“$”即可。例如,查看當(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程序為用戶輸入命令而設(shè)置的提示符。環(huán)境變量PS1的值就是命令主提示符,默認為“uh W$”,其中“”、“”和“”原樣顯示;“u”相應(yīng)位置顯示當(dāng)前登錄的用戶賬號;“h”表示相應(yīng)位置顯示主機名;“W”相應(yīng)位置當(dāng)前工作目錄;“$”表示如果當(dāng)前登錄賬號是
29、超級用戶就顯示“#”,如果是普通用戶就顯示“$”。例如,當(dāng)超級用戶登錄myhost主機時,命令提示符顯示為“rootmyhost root#”。環(huán)境變量PATH記錄了命令執(zhí)行時的默認的搜索路徑,即當(dāng)用戶在命令提示符后輸入命令時,Linux系統(tǒng)會按照PATH設(shè)置的路徑搜索該命令,然后再執(zhí)行該命令。PATH變量的值由多個路徑組成,各路徑之間使用“:”隔開。6.3 shell環(huán)境變量及設(shè)置文件 6.3.1 shell的環(huán)境變量的環(huán)境變量6.3.2 shell配置文件用戶可以通過set命令來查看和設(shè)置常用的環(huán)境變量,但是在系統(tǒng)啟動的時候,Linux并不是通過set命令來設(shè)置這些變量的,而是通過讀取相應(yīng)
30、的shell配置文件來獲取環(huán)境變量的值的。在Linux的bash中其配置文件有全局的配置文件,也有用戶個人的配置文件,shell在檢查這些文件的時候,遵循如下的順序:/etc/profile/.bashrc_profile/.bashrc/etc/bashrc。其中/etc/profile和/etc/bashrc文件中包含了全局環(huán)境變量的設(shè)置,/.bashrc_profile和/.bashrc文件中包含了個人環(huán)境變量的設(shè)置。6.3 shell環(huán)境變量及設(shè)置文件 6.3.2 shell配置文件配置文件1./etc/profile文件etc/profile文件是系統(tǒng)登錄時最先檢查執(zhí)行的shell配
31、置文件,也是Linux系統(tǒng)最主要的shell配置文件,有關(guān)系統(tǒng)最重要的環(huán)境變量都在此定義,如當(dāng)前系統(tǒng)的PATH、USER、LOGNAME、MAIL和HOSTNAME等。在該文件中還定義了每個shell所能執(zhí)行的程序的數(shù)目,即ulimit變量,以免shell過度占用系統(tǒng)資源。另外,在/etc/profile文件末尾會自動執(zhí)行/etc/profile.d目錄下的所有*.sh腳本。2. /.bashrc_profile每個系統(tǒng)用戶的子目錄下都有一個.bashrc_profile文件,用于設(shè)置每個用戶的bash環(huán)境變量,Linux系統(tǒng)啟動時,在讀取/etc/profile文件的內(nèi)容之后,就會檢查該文件
32、。6.3 shell環(huán)境變量及設(shè)置文件 6.3.2 shell配置文件配置文件在該文件中,首先讀取并執(zhí)行/.bashrc文件,然后設(shè)置PATH、BASH_ENV和USERNAME的值。此處的PATH變量的值,除了在全局環(huán)境配置文件/etc/profile文件中設(shè)置的PATH的值以外,還添加了用戶主目錄下的bin目錄。BASH_ENV的值則是接下來需要檢查的文件的名稱。3. /.bashrc在讀取/.bashrc_profile文件的過程中,Linux會在執(zhí)行/.bashrc_profile文件的內(nèi)部中調(diào)用并執(zhí)行/.bashrc文件。另外,與前面兩個文件不同,Linux系統(tǒng)每次用戶登錄bash的
33、時候都會讀取/.bashrc文件,并重新設(shè)置該文件中定義的環(huán)境變量。而/etc/profile和/.bashrc_profile只在系統(tǒng)啟動的時候才讀取。6.3 shell環(huán)境變量及設(shè)置文件 6.3.2 shell配置文件配置文件在/.bashrc文件中只定義了某些別名命令和虛擬終端的設(shè)置。例如,如果telnet登錄時,無法瀏覽超過一頁的信息或文件內(nèi)容,此時可以在該文件中添加如下行:export TERM=vt100另外在該文件的最后還檢查/etc/bashrc文件是否存在,如果存在則轉(zhuǎn)而讀取并執(zhí)行該文件。4./etc/bashrc和/.bashrc文件一樣,用戶每次登錄Linux系統(tǒng)的時候,
34、都會自動讀取并執(zhí)行該文件。在該文件中設(shè)置了系統(tǒng)創(chuàng)建文件時默認的文件存取權(quán)限的掩碼umask的值和用戶自定義的命令提示符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文件不存在時,系統(tǒng)會轉(zhuǎn)而讀取/.bashrc文件。該文件在每次用戶登錄時都會被bash讀取并執(zhí)行。通??梢詫⒂脩舻卿浐蟊仨殘?zhí)行的命令存放在這個文件中。如果/.bash_profile和/.
35、bash_login文件都不存在的情況下,系統(tǒng)會使用/.profile文件中的內(nèi)容設(shè)置當(dāng)前環(huán)境變量的值,其功能與/.bash_profile文件完全相同。Linux系統(tǒng)在注銷前,bash會讀取并執(zhí)行/.bash_logout。通常該文件中只有一個clear清屏命令。如果希望在系統(tǒng)注銷前執(zhí)行一些特定的任務(wù),就可以將相應(yīng)的命令行寫入該文件。/.bash_history文件用于記錄當(dāng)前用戶在登錄系統(tǒng)后所執(zhí)行過的命令。6.3 shell環(huán)境變量及設(shè)置文件 6.3.2 shell配置文件配置文件shell腳本程序,簡稱shell腳本或shell程序,是使用系統(tǒng)提供的命令編寫的文本文件,該文件具有可執(zhí)行的
36、屬性,能夠幫助系統(tǒng)管理員自動管理系統(tǒng)。在Linux的發(fā)行版本中就包含了很多的shell程序,這些腳本有的是為了完成系統(tǒng)參數(shù)的設(shè)置,例如前面介紹的/etc/profile等文件;有的是為了完成某項系統(tǒng)服務(wù)的啟動工作,例如/etc/rc.d/init.d目錄下的所有腳本。6.4.1 shell變變量shell程序語法和其他高級語言程序類似,包括變量、控制結(jié)構(gòu)和函數(shù)等。6.4 shell腳本編程 6.4.1 shell變量變量1.變變量類類型與與使用bash腳本是一種弱類型的腳本語言。所謂弱類型腳本語言,就是在bash腳本中,對類型的要求不嚴格,同一個變量可以隨著使用場合的不同,存儲不同類型的數(shù)據(jù)。
37、弱類型語言變量使用靈活,但是編程者需要注意對變量當(dāng)前存儲的數(shù)據(jù)類型的檢查。1)變量的聲明在bash中,變量的使用不需要顯式的聲明,或者說賦值就可以認為是變量的聲明。通常,給一個變量賦值應(yīng)采用如下的格式:變量名=值注意:等號兩邊不能存在分隔符(包括空格,制表位和回車符)。6.4 shell腳本編程 6.4.1 shell變量變量例如:a1=hellob1=902)變量的引用通常,要引用一個變量,可以采取在變量名前加一個$的方法,即“$變量名”。例如,要引用上面定義的變量a1可以采用如下的方法:echo a1 is $a1但是,有時候這種方法會產(chǎn)生混淆。例如,希望使用變量a1來輸入“hello L
38、inux”字符串。如果使用echo “$a1Linux”就會得不到期待的字符。這是因為bash把“a1Linux”作為一個變量來處理了。此時可以選擇使用以下的幾種用法(其中,value代表一個變量可能取的具體的值):6.4 shell腳本編程 6.4.1 shell變量變量$變量var:-value:如果指定的變量var存在,則返回var的值,否則返回value。$變量var:=value:如果指定的變量var存在,則返回var的值,否則先將value賦給var,然后再返回value。$變量var:+value:如果指定的變量var存在,則返回value,否則返回空值。$變量var:?valu
39、e:如果指定的變量var存在,則返回該var的值,否則將錯誤提示消息value送到標準錯誤輸出并退出shell程序。$變量var:offset:length:offset和length是整數(shù),中括號表示可選部分。表示返回從變量var的第offset+1個字符開始長度為length的子串。如果中括號部分省略,則表示返回變量var第offset+1個字符后面的子串。6.4 shell腳本編程 6.4.1 shell變量變量例6-1 演示bash中變量的使用。如圖下所示。各行的說明如下:6.4 shell腳本編程 6.4.1 shell變量變量bash變量的使用rootmyhost root# va
40、r=hello定義變量var,并被賦值為“hello”rootmyhost root# echo $var $title:-marry!hello marry!變量title在前面都沒有被賦值,所以$title:-marry返回“marry”。rootmyhost root# echo $var $title:+tom!hello !變量title仍然沒有被賦值,即不存在,所以$title:+tom返回空值。rootmyhost root# echo $var $title:?title is null or empty!bash: title: title is null or empty變
41、量title仍然沒有被賦值,即不存在,所以$title:?title is null or empty返回了錯誤信息,即“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仍然沒有被定義,所以title被賦值為“tom and marry”,并返回該值。rootmyhost root# echo $var $title:+somebody!hello so
42、mebody!此時變量title已經(jīng)存在,故返回“somebody”。rootmyhost root# echo $var $title:8:5!hello marry!此處變量title已經(jīng)存在,且值為tom and marry,取其第9個字符,即“m”開始后面5個字符,也就是“marry”。6.4 shell腳本編程 6.4.1 shell變量變量3)特殊變量在shell程序中存在一些特殊變量,當(dāng)shell程序運行時,這些變量能夠記錄shell程序的命令行參數(shù)。這些變量分別是$0、$1、$n,以及$#、$*和$。其中$0存放的是命令行的命令名,$1存放的是命令行中傳遞給命令的第一個參數(shù),依
43、次類推,$n存放的是傳遞給命令的第n個參數(shù)。$#存放傳遞給命令的參數(shù)的個數(shù)(不包括命令),$*和$均用于存放傳遞給命令的所有參數(shù),兩者的區(qū)別在于$*把所有的參數(shù)作為一個整體,而$則把所有的參數(shù)看作是類似于字符串?dāng)?shù)組一樣,可以單獨訪問這些參數(shù)。2. shell表達達式和高級程序語言一樣,shell程序的表達式由運算符和參加運算的操作數(shù)構(gòu)成。操作數(shù)通常可以是變量、常量。6.4 shell腳本編程 6.4.1 shell變量變量1)shell的運算符shell的運算符的使用規(guī)則都與C語言非常類似。2)shell表達式利用運算符將變量或常量連接起來就構(gòu)成了表達式。但是由于在bash中變量和常量沒有特定
44、的數(shù)據(jù)類型,因此在bash中單純使用一個表達式作為命令或語句是錯誤的,而必須使用expr或let命令來指明表達式是一個運算式。expr命令會先求出表達式的值,然后送到標準輸出顯示。let命令會先求出表達式的值,然后賦值給一個變量,而不顯示在標準輸出上。expr和let命令的使用方法如下:expr let 表達式2 .6.4 shell腳本編程 6.4.1 shell變量變量expr命令一次攜帶一個表達式,let命令一次可以攜帶多個表達式。在expr命令的表達式中使用了數(shù)值運算,此時需要用空格將數(shù)字運算符與操作數(shù)分隔開。另外,如果表達式中的運算符是“”、“&”、“*”及“|”等特殊符號,
45、需要使用雙引號、單引號括起來,或?qū)⒎葱备埽ǎ┓旁谶@些符號的前面。而let命令中的多個表達式之間需要空格隔開,而表達式內(nèi)部無需使用空格。例如如下幾個表達式:expr 3+2操作數(shù)3、2和運算符+之間沒有空格,此時bash不會報錯,而是把3+2作為字符串來處理。expr 3 + 2操作數(shù)3、2和運算符+之間有空格,此時bash認為是數(shù)字運算,返回5送到標準輸出設(shè)備。6.4 shell腳本編程 6.4.1 shell變量變量expr 3*2使用雙引號將操作符*括起,此時bash返回乘積6。let s=(2+3)*4s結(jié)果為5*4=20。3條條件判斷斷在編寫程序的時候,經(jīng)常需要根據(jù)某個條件的測試進行程
46、序執(zhí)行分支的選擇。這里的條件可能是某個表達式的值、文件的存取權(quán)限、某段代碼的執(zhí)行結(jié)果,或者是多個條件結(jié)果按照邏輯運算后的值。條件測試的結(jié)果只有真或假2種。需要注意的是,這里“真”的數(shù)值表示為0,“假”的數(shù)值表示為非0,與表達式的真值以及C語言的真值剛好相反。6.4 shell腳本編程 6.4.1 shell變量變量在bash中條件測試的使用方法是,利用test命令或一對中括號包含條件測試表達式,這兩種方法是等價的。它們的格式如下:test cond_expr或 cond_expr 注意:利用一對中括號時,左右的中括號與表達式之間都必須存在空格。cond_expr是需要測試的條件表達式,可以是以
47、下幾種情況:(1)文件存取屬性測試:包括文件類型,文件的訪問權(quán)限等。(2)字符串屬性測試,包括字符串長度,內(nèi)容等。(3)整數(shù)關(guān)系測試,包括大小比較,相等判斷等。(4)上述3種關(guān)系通過邏輯運算(與、或、非)的組合。6.4 shell腳本編程 6.4.1 shell變量變量例6-2 練習(xí)使用文件測試命令。利用shell提供的文件測試命令,測試文件的屬性,如下圖所示。6.4 shell腳本編程 6.4.1 shell變量變量文件屬性測試首先使用test命令測試test.sh是否存在其可寫,從ls l命令返回的結(jié)果看,確實是test.sh文件存在且可寫的,所以“echo $?”命令返回0表示真。然后又
48、使用中括號測試tdir是不是目錄以及是否可寫,從ls l命令的返回來看,tdir同樣是目錄且可寫的,所以返回真。其中“$?”表示引用變量“?”,而變量“?”是一個特殊變量,可以返回緊鄰的前驅(qū)命令的返回值。例6-3練習(xí)使用字符串測試命令利用shell提供的字符串測試命令,字符串測試,如下圖所示。6.4 shell腳本編程 6.4.1 shell變量變量字符串測試例中首先定義了root_home變量,值為/root,變量tom_home,值為/home/tom,然后測試這兩個字符串變量的值是否相等,結(jié)果為1表示不相等。例6-4練習(xí)使用數(shù)值關(guān)系測試命令。數(shù)值關(guān)系測試,如下圖所示。6.4 shell腳
49、本編程 6.4.1 shell變量變量數(shù)值關(guān)系測試首先定義變量var1,值為200,變量var2,值為300,接著測試var1的值是否等于var2的值。返回值為1,表示這兩個變量不等。然后又測試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í)行過程中可以根據(jù)某個條件的測試值,來選擇程序執(zhí)行的路徑。在shell程序中,控制結(jié)構(gòu)可以簡單地分為分支和循環(huán)結(jié)構(gòu)2類。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
50、結(jié)構(gòu)。它們的使用方法與C語言等高級程序設(shè)計語言中相應(yīng)的結(jié)構(gòu)類似。6.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 條件測試1 ;thencommand_list_1elif 條件測試2 ; thencommand_list_2 elsecommand_list_3 fi6.4 shell腳本編程 6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu)其中,中括號部分為可選部分。當(dāng)“條件測試1”為真時,執(zhí)行command_list_1,否則如果存在elif語句,則測試“條件測試2”,如果為真,執(zhí)行command_list_2。如果
51、elif語句不存在或“條件測試2為假,則執(zhí)行command_list_3。條件測試部分一般可以是test或修飾的條件表達式。例6-5 根據(jù)用戶輸入的目錄名稱判斷該目錄是否存在,如果存在則進入該目錄,否則測試同名文件是否存在,如果存在,則退出shell程序,否則新建同名目錄,并進入該目錄。#!/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#測試$dir_name目錄是否存在if d $dir_name ;
52、thencd $dir_name /dev/null 2$1echo $dir_name has already existed,enter directory succeed#測試是否存在與$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 n
53、ot existed,create and enter directory succeedfi在該例中,“cd $dir_name /dev/null 2$1”表示cd命令可能產(chǎn)生的標準輸出信息和標準錯誤輸出信息重定向的到一個空設(shè)備/dev/null,從而實現(xiàn)隱藏cd命令錯誤輸出的功能?!癿kdir $dir_name /dev/null 2$1”命令行的作用類似。由于Linux不允許在同一目錄下存在同名的文件和目錄,所有如果$dir_name不存在時,還要測試是否有同名的文件存在,然后才能新建該目錄。6.4 shell腳本編程 6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu)注意:then命令可以和i
54、f結(jié)構(gòu)寫在同一行,但是如果then命令和if結(jié)構(gòu)在同一行時,then命令的前面一定要有一個分號,且分號與條件測試表達式之間用空格隔開。2.case分支結(jié)構(gòu)結(jié)構(gòu)if結(jié)構(gòu)用于存在兩種分支選擇的情況下,當(dāng)程序存在多個分支的選擇時,如果使用if結(jié)構(gòu),就必須使用多個elif結(jié)構(gòu),從而使得程序的結(jié)構(gòu)冗余,此時可以選在使用case結(jié)構(gòu)。case結(jié)構(gòu)可以幫助程序靈活地完成多路分支的選擇,而且程序結(jié)構(gòu)直觀、簡潔。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;* )
55、command_list_n; esac其中,expr可以是變量、表達式或shell命令等,模式為expr的取值。通常一個模式可以是expr的多種取值,使用或(|)連接。模式中還可以使用通配符,星號(*)表示匹6.4 shell腳本編程 6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu)配任意字符值,問號(?)表示匹配任意一個字符,.可以匹配某個范圍內(nèi)的字符。在case分支結(jié)構(gòu)中,首先計算expr的值,然后根據(jù)求得的值查找匹配的模式,接著執(zhí)行對應(yīng)模式后面的命令序列,執(zhí)行完成后,退出case結(jié)構(gòu)。需要注意的是,在case結(jié)構(gòu)的命令序列后面需要使用雙分號(;)分隔下一個模式。例6-5 使用case語句編寫程序
56、,根據(jù)上網(wǎng)地址的不同為計算機設(shè)置不同的IP地址參數(shù)。#!/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
57、|o|O) /sbin/ifconfig eth0 8 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)地點是在家中,此時IP地址為18,網(wǎng)絡(luò)掩碼為24,默認網(wǎng)關(guān)為。如果用戶輸入office、o或O則表示上網(wǎng)地點是在辦公室內(nèi),此時IP地址為192.1
58、68.1.118,網(wǎng)絡(luò)掩碼為24,默認網(wǎng)關(guān)為。其他的輸入無效,并給出提示“input error!”。其中ifconig和route命令在后面的章節(jié)中將詳細介紹。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中的第一個值,取到最后一個值。do和done結(jié)構(gòu)
59、之間的command_list是循環(huán)需要執(zhí)行的命令序列,變量var每取一個值都會循環(huán)執(zhí)行一次command_list中的命令。同樣中括號部分為可選部分,如果省略了該部分,bash會從命令行參數(shù)中為var取值,即等同于“in $”。6.4 shell腳本編程 6.4.2 shell控制結(jié)構(gòu)控制結(jié)構(gòu)例6-6 使用for語句編寫程序,向系統(tǒng)添加10個用戶,其名稱分別是student1、student2、student10。#!/bin/bash# an example script of forfor i in 1 10 doif -d /home/student$i ; thenecho the
60、directory /home/student$i exist.echo the content of directory /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命令會在/home
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年建筑工程分包商承包合同模板
- 2024年度廣告制作發(fā)布合同
- 2024年式培訓(xùn)學(xué)校教室租用合同
- 2024年度品牌授權(quán)合同
- 2024年戰(zhàn)略規(guī)劃保密合同
- 2024年打印紙小批量采購合同
- 2024年度健身房管理與運營合同
- 2024年度軟件許可與服務(wù)合同
- 2024年個人財產(chǎn)保護協(xié)議
- 2024年二手房交易過程中甲方權(quán)益保障合同
- 君子自強不息課件
- 2022人教版高二英語新教材選擇性必修全四冊課文原文及翻譯(英漢對照)
- WDZANYJY23低壓電力電纜技術(shù)規(guī)格書
- 抗高血壓藥物基因檢測課件
- 醫(yī)院管理醫(yī)院應(yīng)急調(diào)配機制
- (公開課)文言文斷句-完整版課件
- 小學(xué)生性教育調(diào)查問卷
- 醫(yī)院感染管理質(zhì)量持續(xù)改進反饋表
- 旅游行政管理第二章旅游行政管理體制課件
- 學(xué)生崗位實習(xí)家長(或法定監(jiān)護人)知情同意書
- 衛(wèi)生院關(guān)于召開基本公共衛(wèi)生服務(wù)項目培訓(xùn)會的通知
評論
0/150
提交評論