




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、UNIX/Linux Shell的程序編寫Unix系列shell程序編寫(上)一、*Shell是什么? 任何發明都具有供用戶使用的界面。UNIX供用戶使用的界面就是Shell(DOS的command熟悉吧,但UNIX的要強大的多)。 Shell為用戶提供了輸入命令和參數并可得到命令執行結果的環境。為了不同的需要,UNIX提供了不同的Shell。現在的UNIX大部分都支持BourneShell,以下教程就以BourneShell(Bsh)為例,一步步的領略UNIX Shell的強大功能,占先其強大魅力,達到更方便靈活的管理、應用UNIX的目的。 1.UNIX內核和Shell的交互方法 啟動UNI
2、X時,程序UNIX(內核)將被調入計算機內存,并一直保留在內存中直到機器關閉。在引導過程中,程序init將進入后臺運行一直到機器關閉。該程序查詢文件/etc/inittab,該文件列出了連接終端的各個端口及其特征。當發現一個活動的終端時,init程序調用getty程序在終端上顯示login等登陸信息。(username和passwd),在輸入密碼后, getty調用login進程,該進程根據文件/etc/passwd的內容來驗證用戶的身份。若用戶通過身份驗證,login進程把用戶的home目錄設置成當前目錄并把控制交給一系列setup程序。setup程序可以是指定的應用程序,通常setup程序
3、為一個Shell程序,如:/bin/sh 即Bourne Shell(command出來了,呵呵)。 得到控制后,Shell程序讀取并執行文件/etc/.profile以及.profile。這兩個文件分別建立了系統范圍內的和該用戶自己的工作環境。最后Shell顯示命令提示符,如$。(這是以bsh為例,若是csh,為.cshrc,ksh為.kshrc,bash為.bashrc等等) 注不妨把/etc/.profile和.profile看成DOS的autoexec.bat 或 config.sys文件) 當shell退出時,內核把控制交給init程序,該程序重新啟動自動登陸過程。有兩種方法使she
4、ll退出,一是用戶執行exit命令,二是內核(例如root用kill命令)發出一個kill命令結束shell進程。shell退出后,內核回收用戶及程序使用的資源。 用戶登陸后,用戶命令同計算機交互的關系為:命令進程->Shell程序->UNIX內核->計算機硬件。當用戶輸入一個命令,如$ls,Shell將定位其可執行文件/bin/ls并把其傳遞給內核執行。內核產生一個新的子進程調用并執行/bin/ls。當程序執行完畢后,內核取消 該子進程并把控制交給其父進程,即Shell程序。例如執行: $ps 該命令將會列出用戶正在執行的進程,即Shell程序(下來詳細說說,別急現在)和p
5、s程序。若執行: $sleep 10 & $ps 其中第一條命令將產生一個在后臺執行的sleep子進程。ps命令執行時會顯示出該子進程。 每當用戶執行一條命令時,就會產生一個子進程。該子進程的執行與其父進程或Shell完全無關,這樣可以使Shell去做其他工作。(Shell只是把用戶的意圖告訴內核,然后該干嘛干嘛)現在windows有個計劃任務(在固定的時間,日期自動執行某任務),其實UNIX很早就有這個功能了,也就是所謂的Shell的自動執行。一些UNIX資源,如cron可以自動執行Shell程序而無需用戶的參與,(這個功能好象在/var/spool/crotab目錄里)。 Cron
6、tab 程序對于系統管理員來說是非常有用的。Cron服務用于計劃程序在特定時間(月、日、周、時、分)運行。我們以root的crontab 為例。根用戶的crontab 文件放在 /var/spool/crontab/root 中,其格式如下: (1) (2) (3) (4) (5) (6) 0 0 * * 3 /usr/bin/updatedb 1. 分鐘 (0-60) 2. 小時 (0-23) 3. 日 (1-31) 4. 月 (1-12) 5. 星期 (1-7) 6. 所要運行的程序 2.Shell的功能和特點 1>命令行解釋 對于"命令行解釋"就不多說了,就是在
7、shell提示符(例如:"$","%","#"等)后輸入一行unix命令,Shell將接收用戶的輸入。2>使用保留字 "使用保留字":Shell有一些具有特殊意義的字,例如在Shell腳本中,do,done,for等字用來控制循環操作,if,then等控制條件操作保留字隨Shell環境的不同而不同。3>使用Shell元字符(通配符) "通配符":* 匹配任何位置 ? 匹配單個字符 匹配的字符范圍或列表 例如: $ls a-c* 將列出以a-c范圍內字符開頭的所有文件 $ls a,m,
8、t* 將列出以e,m或t開頭的所有文件4>可處理程序命令 "程序命令" :當用戶輸入命令后,Shell讀取環境變量$path(一般在用戶自己的.profile中設置),該變量包含了命令可執行文件可能存在的目錄列表。 shell從這些目錄中尋找命令所對應的可執行文件,然后將該文件送給內核執行。5>使用輸入輸出重定向和管道 "輸入輸出重定向及管道" :重定向的功能同DOS的重定向功能: ">" 重定向輸出 "<" 重定向輸入 而管道符號,是unix功能強大的一個地方,符號是一條豎線:"
9、|",用法: command 1 | command 2 他的功能是把第一個命令command 1執行的結果作為command 2的輸入傳給command 2,例如: $ls -s|sort -nr|pg 該命令列出當前目錄中的所有文件,并把輸出送給sort命令作為輸入,sort命令按數字遞減的順序把ls的輸出排序。然后把排序后的內容傳送給pg命令,pg命令在顯示器上顯示sort命令排序后的內容。6>維護一些變量 "維護變量" :Shell可以維護一些變量。變量中存放一些數據供以后使用。用戶可以用"="給變量賦值,如: $lookup=/
10、usr/mydir 該命令建立一個名為lookup的變量并給其賦值/usr/mydir,以后用戶可以在命令行中使用lookup來代替/usr/mydir,例如: $echo $lookup 結果顯示:/usr/mydir 為了使變量能被子進程使用,可用exprot命令,例如: $lookup=/usr/mydir $export lookup7>運行環境控制 "運行環境控制" : 當用戶登陸啟動shell后,shell要為用戶創建一個工作的環境,如下: <1>當login程序激活用戶shell后,將為用戶建立環境變量。從/etc/profile和.prof
11、ile文件中讀出,在這些文件中一般都用$TERM變量設置終端類型,用$PATH變量設置Shell尋找可執行文件的路徑。 <2>從/etc/passwd文件或命令行啟動shell時,用戶可以給shell程序指定一些參數,例如"-x",可以在命令執行前顯示該命令及其參數。后面詳細介紹這些參數。8>支持Shell編程 "shell編程" :本文主要介紹的內容。 二、shell編程shell本身也是一種語言(*可以先理解為unix命令的組合,加上類C的條件,循環等程序控制語句,類似dos批處理,但要強大的多),用戶可以通過shell編程(腳本,
12、文本文件),完成特定的工作。 SHELL變量 下面我們詳細的介紹Bourne Shell的編程: 自從貝爾實驗室設計了Bourne Shell。從那時起許多廠商根據不同的硬件平臺設計了許多版本得unix。但在眾多版本的unix中,Bourne Shell一直保持一致。 1、Bsh的啟動:用戶在登陸后,系統根據文件/etc/passwd中有關該用戶的信息項啟動Shell。例如某用戶在passwd中的信息項為: ice_walk:!:411:103:Imsnow ,ice_walk:/home/ice_walk:/bin/bsh 則表明,用戶名是ice_walk等信息,在最后一項"/bi
13、n/bsh"表明用戶的sh環境類型是bsh,于是系統啟動之。在啟動或執行(包括下面我們要講的shell程序-腳本)過程中可以使用以下一些參數,我們一一說明: -a 將所有變量輸出 -c "string"從string中讀取命令 -e 使用非交互式模式 -f 禁止shell文件名產生 -h 定義 -i 交互式模式 -k 為命令的執行設置選項 -n 讀取命令但不執行 -r 受限模式 -s 命令從標準輸入讀取 -t 執行一命令,然后退出shell -u 在替換時,使用未設置的變量將會出錯 -v 顯示shell的輸入行 -x 跟蹤模式,顯示執行的命令 許多模式可以組合起來
14、用,您可以試試了,但-ei好象不行,你說why呢? 使用set可以設置或取消shell的選項來改變shell環境。打開選項用"-",關閉選項用"+",多數unix允許打開或關閉a、f、e、h、k、n、u、v和x選項。若顯示Shell中已經設置的選項,執行: $echo $- Bsh中每個用戶的home目錄下都有一個.profile文件,可以修改該文件來修改shell環境。為了增加一個可執行文件的路徑(例如/ice_walk/bin),可以把下面代碼加入.profile中 PATH=$PATH:/ice_walk/bin;exprot PATH .prof
15、ile中shell的環境變量意思如下: CDPATH 執行cd命令時使用的搜索路徑 HOME 用戶的home目錄 IFS 內部的域分割符,一般為空格符、制表符、或換行符 MAIL 指定特定文件(信箱)的路徑,有UNIX郵件系統使用 PATH 尋找命令的搜索路徑(同dos的config.sys的 path) PS1 主命令提示符,默認是"$" PS2 從命令提示符,默認是">" TERM 使用終端類型 2、Bsh里特殊字符及其含義 在Bsh中有一組非字母字符。這些字符的用途分為四類:作為特殊變量名、產生文件名、數據或程序控制以及引用和逃逸字符控制。他
16、們可以讓用戶在Shell中使用最少的代碼完成復雜的任務。 *> Shell變量名使用的特殊字符 $# 傳送給命令Shell的參數序號 $- 在Shell啟動或使用set命令時提供選項 $? 上一條命令執行后返回的值 $ 當前shell的進程號 $! 上一個子進程的進程號 $ 所有的參數,每個都用雙括號括起 $* 所有參數,用雙括號括起 $n 位置參數值,n表示位置 $0 當前shell名 *>產生文件名的特殊字符 包括"*","?","",上面講過,不再多說。 *>數據或程序控制使用的特殊字符 >(file)
17、輸出重定向到文件中(沒有文件則創建,有則覆蓋) >>(file) 輸出重定向到文件中(沒有則創建,有則追加到文件尾部) <(file) 輸入重定向到文件 ; 命令分割符 | 管道符 & 后臺運行(例如:sleep 10 &) 命令替換,重定向一條命令的輸出作為另一命令的參數 *>對于引用或逃逸的特殊字符 Bsh用單引號' '和雙引號" "將特殊字符或由空白分隔的字引用起來組成一個簡單的數據串.使用單引號和雙引號的區別是雙引號中的內容可進行參數和變量替換.逃逸字符也一樣. $echo "$HOME $PATH&
18、quot; 結果顯示$/u/ice_walk/bin:/etc:/usr/bin 而$echo '$HOME $PATH' 結果顯示$HOME $PATH shell的逃逸符是一個"",表示其后的字符不具有特殊的含義或不是shell的函數 $echo $HOME $PATH 結果顯$HOME /bin:/etc:/usr/bin: 3、Bsh的變量 前面我們在多個地方引用了變量,當Shell遇到一個"$"符時(沒有被引用或逃逸),它將認為其后為一變量。不論該變量是環境變量還是用戶自定義的變量,在命令行中變量名要被變量值替換。例如命令:ls
19、 $HOME將列出變量HOME對應目錄下的文件。 用戶可以在命令行中的任何地方進行變量替換。包括命令名本身,例如: $dir=ls $dir f* 將列出以f開頭的文件。 現在詳細的介紹下Bsh的變量。Bsh中有四類變量:用戶定義的變量、位置變量(shell參數)、預定義變量及環境變量。 用戶定義的變量: 用戶定義的變量由字母和下劃線組成,并且變量名的第一個字符不能為數字(09)。與其他UNIX名字一樣,變量名是大小寫敏感的。用戶可以在命令行上用"="給變量賦值,例如: $NAME=ice_walk 給變量NAME賦值為ice_walk,在應用變量NAME的時候,在NAME
20、前加"$"即可,前面已說,不再廢話(別說我廢話多,關鍵是沒當過老師)。可以用變量和其他字符組成新的字,例如: $SUN=sun $echo $SUNday 在應用shell變量時候,可以在變量名字兩邊$后面加上,以更加清楚的顯示給shell,哪個是真正的變量,以實現字符串的合并等功能。 結果顯示:sunday(注意不能echo $SUNday,因為SUNday變量沒定義,讀者試下執行結果) 用戶也可以在命令行上同時對多個變量賦值,賦值語句之間用空格分開: $X=x Y=y 注意變量賦值是從右到左進行的 $X=$Y Y=y X的值是y $X=z Y=$Z Y的值是空(變量未賦
21、值時,shell不報錯,而是賦值為空) 用戶可以使用"unset <變量>"命令清除給變量賦的值,用戶使用變量時要在其前面加一"$"符,使變量名被變量值所替換。Bsh可以進行變量的條件替換,即只有某種條件發生時才進行替換。替換條件放在一對大括號中,如: $variable: -value variable是一變量值,value是變量替換使用的默認值 $echo Hello $UNAME 結果顯示:Hello $echo Hello $UNAME: -there 結果顯示:Hello there $echo $UNAME 結果顯示: (空) $
22、UNAME=John $echo Hello $UNAME: -there 結果顯示:Hello John 可以看出,變量替換時將使用命令行中定義的默認值,但變量的值并沒有因此而改變。另外一種替換的方法是不但使用默認值進行替換,而且將默認值賦給該變量。其形式如下: $variable:=value 該形式在變量替換后同時把值value符給變量variable。 $echo Hello $UNAME 結果顯示:Hello $echo Hello $UNAME:=there 結果顯示:Hello there $echo $UNAME 結果顯示:there $UNAME=John $echo Hel
23、lo $UNAME:-there 結果顯示:Hello John 變量替換的值也可以是 括起來的命令: $USERDIR=$Mydir: -pwd 第三種變量的替換方法是只有當變量已賦值時才用指定值替換形式: $variable: +value 只有變量variable已賦值時,其值才用value替換,否則不進行任何替換,例如: $ERROPT=A $echo $ERROPT: +"Error tracking is acitive" 結果顯示:Error tracking is acitive $ERROPT= $echo $ERROPT: +"Error tr
24、acking is acitive" 結果顯示: (空) 我們還可以使用錯誤檢查的條件進行變量替換: $variable:?message 當變量variable已設置時,正常替換。否則消息message將送到標準錯誤輸出(若此替換出現在shell程序中,那么該程序將終止)。例如: $UNAME= $echo $ UNAME:?"UNAME HAS NOT BEEN SET" 結果顯示:UNAME HAS NOT BEEN SET $UNAME=Stephanie $echo $ UNAME:?"UNAME HAS NOT BEEN SET"
25、結果顯示:Stephanie 當沒有指定message時,shell將顯示一條默認的消息,例如: $UNAME= $echo $ UNAME:? 結果顯示:sh:UNAME:parameter null or not set 4、位置變量或Shell參數 在shell解釋用戶的命令時,將把命令行的第一個字作為命令,而其他的字作為參數。當命令對應的可執行文件為Shell程序時,這些參數將作為位置變量傳送給該程序。第一個參數記為$1,第二個為$2.第九個為$9。其中1到9是真正的參數名,"$"符只是用來標識變量的替換。 位置變量$0指命令對應的可執行文件名。在后面將詳細介紹位置
26、變量。 1.只讀變量 用戶將變量賦值后,為了防止以后對該變量的修改,可以用以下命令將該變量設置為只讀變量: readonly variable 2.export命令 shell執行一個程序時,首先為該程序建立一個新的執行環境,稱為子shell。在Bourne Shell中變量都是局部的,即他們只在創建他們的Shell中有意義。用戶可以用export命令讓變量被其他子Shell識別。但某用戶的變量是沒法讓其他用戶使用的。 當用戶啟動一個新shell時,該shell將使用默認的提示符。因為賦給變量PS1的值只在當前shell中有效。為了讓子Shell使用當前Shell中定義的提示符號,可以使用ex
27、port命令: $PS1="Enter command:" Enter command:export PS1 Enter command:sh Enter command: 此時變量PS1變成了全局變量。它可以被其子Shell使用。當變量被設置成全局的以后,將一直保持有效直到用戶退出該變量所在的Shell。用戶可以在文件.profile中給一個變量永久賦值。詳見"規范Shell"。 三、基本語句 從本節起,我們將詳細介紹Shell程序設計的基本知識,通過編寫Shell腳本,用戶可以根據自己的需要有條件的或者重復的執行命令。通過Shell程序,可以把單個的
28、UNIX命令組合成一個完全實用的工具,完成用戶的任務。 1>什么是Shell程序 當用戶在UNIX Shell中輸入了一條復雜的命令,如: $ls -R /|greo myname |pg 我們可以稱用戶在對Shell編程,當把這條語句寫在一個文件里,并且符給該文件可執行權限,那么該文件就是我們傳統上說的Shell程序。 2>簡單的Shell程序 假設用戶每天使用下述命令備份自己的數據文件: $cd /usr/icewalk;ls * |cpio -o > /dev/fd0 我們可以把它寫在一個文件,如:ba.sh中: $cat >ba.sh cd /usr/icewa
29、lk ls * |cpio -o > /dev/fd0 D (ctrl_d) 程序ba.sh就是Shell腳本,用戶可以用vi或其他編輯工具編寫更復雜的腳本。 此時用戶備份文件只需要執行Shell程序ba.sh,執行時需在當前Shell中創建一個子Shell: $sh ba.sh 程序sh與用戶登陸時執行的Bourne Shell相同,但當Sh命令帶參數ba.sh后,它將不再是一個交互式的Shell,而是直接從文件ba.sh中讀取命令。 執行ba.sh中命令的另一方法是給文件ba.sh執行權限: $chmod +x ba.sh 此時,用戶可以輸入文件名ba.sh做為一個命令來備份自己的數
30、據,需要注意的是,用這種方法執行命令的時候,文件ba.sh必須存在于環境變量$PATH所指定的路徑上。 Unix系列shell程序編寫(中) 3>在Shell中使用數據變量 用戶可以在Shell中使用數據變量,例如ba.sh程序: cd/usr/icewalk ls|cpio -o > /dev/fd0 該程序中要備份的目錄為一常量,即該程序只能用來備份一個目錄。若在該程序中使用變量,則會使其更通用: workdir=$1 cd $workdir ls * |cpio -o > /dev/fd0 通過這一改變,用戶可以使用程序備份變量$workdir指定的目錄。例如我們要備份
31、/home/www的內容,只要運行ba.sh /home/www即可實現。(若不明白 $1,下面將詳細介紹shell參數的傳遞,$1代表本sh程序-ba.sh的第一個參數) 4>在Shell程序中加上注釋 為了增加程序的可讀性,我們提倡加入注釋。在Shell程序中注釋將以"#"號開始。當Shell解釋到"#"時,會認為從"#"號起一直到該行行尾為注釋。 5>對Shell變量進行算術運算 高級語言中變量是具有類型的,即變量將被限制為某一數據類型,如整數或字符類型。Shell變量通常按字符進行存儲,為了對Shell變量進行算術
32、運算,必須使用expr命令。 expr命令將把一個算術表達式作為參數,通常形式如下: expr 數字 操作符 數字 由于Shell是按字符形式存儲變量的,所以用戶必須保證參加算術運算的操作數必須為數值。下面是有效的算術操作符: +兩個整數相加 -第一個數減去第二個數 *兩整數相乘 /第一個整數除以第二個整數 %兩整數相除,取余數 例如: $expr 2 + 1 結果顯示:3 $expr 5 - 3 結果顯示:2 若expr的一個參數是變量,那么在表達式計算之前用變量值替換變量名。 $int=3 $expr $int + 4 結果顯示:7 用戶不能單純使用"*"做乘法,若輸入
33、: $expr 4*5 系統將會報錯,因為Shell看到"*"將會首先進行文件名替換。正確形式為: $expr 4 * 5 結果顯示:20 多個算術表達式可以組合在一起,例如: $expr 5 + 7 / 3 結果顯示:7 運算次序是先乘除后加減,若要改變運算次序,必須使用""號,如: $int=expr 5 + 7 $expr $int/3 結果顯示:4 或者: $expr expr 5+7/3 結果顯示:4 6>向Shell程序傳遞參數 一個程序可以使用兩種方法獲得輸入數據。一是執行時使用參數。另一種方法是交互式地獲得數據。vi編輯程序可以通過
34、交互式的方法獲得數據,而ls和expr則從參數中取得數據。以上兩種方法Shell程序都可以使用。在"交互式讀入數據"一節中將介紹Shell程序通過交互式的方法獲得參數。 通過命令行給Shell程序傳遞參數可以擴大程序的用途。以前面提到的ba.sh程序為例: $cat >re.sh cd $workdir cpio -i < /dev/fd0 d 程序re.sh恢復了ba.sh程序備份的所有文件。若只從軟盤上恢復一個指定的文件,可以用該文件名作為參數,傳遞給Shell程序re.sh: 程序改寫如下: $cat >re2.sh cd $workdir cpio
35、 -i $1 < /dev/fd0 d 用戶可以指定要恢復的文件,例如fname $re2.sh fname 此時文件fname作為第一個位置參數傳遞給re2.sh,re2.sh的缺點是要恢復兩個或多個文件要重復運行,我們可以用$*變量傳遞不確定的參數給程序: $cat >re3.sh cd $workdir cpio -i $* < /dev/fd0 d 我們就可以恢復多個文件,例如fname1,fname2,fname3 $re3.sh fname1 fname2 fname3 (以上程序re.sh,re2.sh,re3.sh,假設用戶已經chmod了可執行權利) 因為沒
36、有賦值的變量可以作為NULL看待,所以若是程序re3.sh在執行時候沒賦予參數,那么一個空值將被插入到cpio命令中。該命令將恢復所有保存的文件。 1、條件判斷語句 條件判斷語句是程序設計語言中十分重要的語句,該語句的含義是當某一條件滿足時,執行指定的一組命令。 1>if - then語句 格式: if command1 then command2 command3 fi-(if 語句結束) command4 每個程序或命令執行結束后都有一個返回的狀態,用戶可以用Shell變量$?獲得這一狀態。if語句檢查前面命令執行的返回狀態,若該命令成功執行,那么在then和fi之間的命令都將被執行
37、。在上面的命令序列中,command1和command4總要執行。若command1成功執行,command2和command3也將執行。 請看下面程序: #unload -program to backup and remove files cd $1 ls -a | cpio -o > /dev/mnt0 rm * 該程序在備份資料后,刪除檔案,但當cpio命令不能成功執行時,rm命令還是把資料刪除了,我們可不希望這樣,為了避免此情況,可以用if - then語句: #-卸載和判斷刪除程序 cd $1 if ls -a | cpio > /dev/mnt0 then rm *
38、fi 上面程序在cpio執行成功后才刪除檔案 同時,若執行沒有成功,我們希望得到提示,sh中的echo命令可以向用戶顯示消息,并顯示后換行,上面程序可以寫成: #-卸載和判斷刪除程序 cd $1 if ls -a | cpio > /dev/mnt0 then echo "正刪除文件資料. ." rm * fi echo命令可以使用一些特殊的逃逸字符進行格式化輸出,下面是這些字符及其含義: bBackspace c顯示后不換行 f在終端上屏幕的開始處顯示 n換行 r回車 t制表符 v垂直制表符 反斜框 0nnn 用1,2或3位8進制整數表示一個ASCII碼字符 2&g
39、t;if - then - else語句 不用多說它的作用,別的高級語言中都有,格式為: if command1 then command2 command3 else command4 command5 fi 在此結構中,command1中是先執行,當command1成功執行時,將執行command2和command3,否則執行command4和command5 注意看下面程序: #備份程序 cd $1 if ls -a |cpio -o > /dev/mnt0 then echo "刪除源資料. ." rm * else echo "磁帶備份失敗!&qu
40、ot; fi 3>test命令進行條件測試 if語句可以通過測試命令執行的返回狀態來控制命令的執行,若要測試其他條件,在bsh中可以使用test命令。該命令檢測某一條件,當條件為真時返回0,否則返回非0值。test命令可以使Shell程序中的if語句象其他程序語言中的條件判斷語句一樣,具有很強的功能。 test命令的使用方法為: test condition 可測試的條件分為4類: 1)測試兩個字符串之間的關系。 2)測試兩個整數之間關系。 3)測試文件是否存在或是否具有某種狀態或屬性。 4)測試多個條件的與(and)或(or)組合。 1、條件語句>>test語句 1>
41、測試字符串間的關系 bsh把所有的命令行和變量都看作字符串。一些命令如expr和test可以把字符當作數字進行操作。 同樣任何數字也可以作為字符串進行操作。 用戶可以比較兩個字符串相等或不等,也可以測試一個串是否賦了值。有關串的操作符如下: str1 = str2當兩個串有相同內容、長度時為真 str1 != str2 當串str1和str2不等時為真 -n str1 當串的長度大于0時為真(串非空) -z str1 當串的長度為0時為真(空串) str1 當串str1為非空時為真 不但Shell程序可以使用test進行條件判斷,test命令也可以獨立執行,如: $str1=abcd $tes
42、t $str1 = abcd $echo $? 結果顯示:0 與上例中第一行賦值語句中的等號不同,test命令中的等號兩邊必須要有空格。本例test命令共有3個參數。注意兩個串相等必須是長度和內容都相等。 $str1="abcd " $test "$str1" = abcd $echo $? 結果顯示:1 上面str1包含5個字符,其中最后一個為空格符。而test命令中的另一個串只有4個字符,所以兩串不等,test返回1。 不帶任何操作符和使用-n操作符測試一個串結果是一樣的,例如: $str1=abce $test $str1 $echo $? 結果顯
43、示:0 $test -n $str1 $echo $? 結果顯示:0 但是,上面兩條命令也有一點差別,反映出了使用test命令潛在的問題,請看下例: $str1="" $test $str1 $echo $? 結果顯示:1 $test -n "$str1" $echo $? 結果顯示:0 $test -n $str1 結果顯示:test:argument expected 上例中,第一次測試為假因為Shell在執行命令行之前首先要進行變量替換,即把$str1換成空格,然后shell又將命令行上的空格刪除,故test命令測試到的為空串。而在第二次測試中,變
44、量替換后空格位于括號內,故不會被刪除,test測試到的是一個包含空格的串,在第三次測試中,shell把空格刪除,只把-n傳個test命令,所以顯示參數錯。 2>測試兩個整數之間關系 test命令與expr命令一樣,也可以把字符轉變成整數,然后對其操作。test命令對兩個數進行比較,使用的操作符如下: int1 -eq int2兩數相等為真 int1 -ne int2兩數不等為真 int1 -gt int2int1大于int2為真 int1 -ge int2int1大于等于int2為真 int1 -lt int2int1小于int2為真 int1 -le int2int1小于等于int2為
45、真 下面的例子反映了字符串比較與數字比較的不同: $str1=1234 $str2=01234 $test $str1 = $str2 $echo $? 結果顯示:1 $test $str1 -eq $str2 $echo $? 結果顯示:0 3>有關文件的測試 使用test進行的第三類測試是測試文件的狀態,用戶可以測試文件是否存在,是否可寫以及其他文件屬性。下面是文件測試時使用的選項。注意只有文件存在時,才有可能為真。 -r file用戶可讀為真 -w file用戶可寫為真 -x file用戶可執行為真 -f file文件為正規文件為真 -d file文件為目錄為真 -c file文件
46、為字符特殊文件為真 -b file文件為塊特殊文件為真 -s file文件大小非0時為真 -t file當文件描述符(默認為1)指定的設備為終端時為真 4>復雜的條件測試(and 、or 、not) -a 與 -o 或 !非 就是組合條件了,任何高級語言中都有的(NOT 、AND 、OR),例如: $test -r em.null -a -s em.null $echo $? 結果顯示:1 說明了em.null并不是可讀并且非空的文件 5>另一種執行test的方法 bsh中還有另一種執行test命令的方法,就是把測試條件放到一對 中,例如: $int1=4 $ $int1 -gt
47、2 $echo $? 結果顯示:0 要注意在 的后面和 符號的前面要有一個空格。 下面我們用test命令寫個簡單但比較完善的程序: #- 備份程序 #- 檢查參數 if $# -ne 1 then echo "請在程序名后面指出要備份文件所在目錄!" exit 1 fi #- 檢查目錄名是否有效 if !-d "$1" then echo "$1 不是一個目錄!" exit 2 fi cd $1 ls -a | cpio -o >/dev/mnt0 if $? -eq 0 then rm * else echo "cp
48、io執行不成功!備份失敗." exit 3 fi 6>空命令 在Bsh中用 : 代表空命令,就是充個數,什么都不做 7>嵌套if語句和elif結構 檢查條件1 A:當條件1為真,則執行一部分操作 B:若條件1為假,檢查條件2 1)若條件2為真,執行另外一部分操作 2)若條件2為假,檢查條件3 3)若條件3為真,執行其他一部分操作 語法如下: if command then command else if command then command else if command then command fi fi fi 8>elif語句 嵌套if語句有時會給用戶帶來
49、混亂,特別是什么時候fi語句很難判斷。因此Bourne Shell又提供了elif語句。elif是else-if的縮寫,它表示是if語句的繼續。格式為: if command then command elif command then command elif command then command fi 上面介紹的嵌套if語句和elif語句完成相同的功能,用戶可以根據自己的喜好選擇一種使用。 9>case語句 前面說的elif語句替代if-then-else語句,但有時在編程時還會遇到對同一變量進行多次的測試,該情況可以用多個elif語句實現,但還有一種更簡單的方法就是用case語
50、句。 case語句不但取代了多個elif和then語句,還可以用變量值對多個模式進行匹配,當某個模式與變量值匹配后,其后的一系列命令將被執行,下面是case語句使用的語句。 case value in pattem 1) command command; pattem 2) command command; . pattem) command; esac case語句只執行其中的一組命令,當變量值與多個模式相匹配時,只有第一個匹配的模式對應的命令被執行。""表示該模式對應的命令部分程序。 通過學習下面的read語句,我們們再舉例子說明case語句的用法。 10>rea
51、d語句 Shell程序不但可以通過命令行參數得到輸入數據,還可以使用read命令提示用戶輸入數據,其語法格式為: read var1 var2. .varn 當Bsh遇到一個read語句時,在標準輸入文件中讀取數據直到一個換行符。此時Shell在解釋輸入行時,不進行文件名或變量的替換,只是簡單地刪除多余的空格。然后Shell將輸入行的第一個字的內容給變量1,第二個給變量2,直到所有變量都賦上值或是輸入行為空。若輸入行中字的個數超過變量個數,Shell將把輸入行中剩余的所有字的內容都賦給最后一個變量。當變量個數多于輸入行字的個數時候,多于的變量將賦一個空值。輸入行的每一個字是由空格分隔的一個字母和數字組成的字符串。 $read var1 var2 var3 輸入:Hello my friend $echo $var1 $var2 $var3 結果顯示:Hello my friend $echo $var2 結果顯示:my 下面用個read和case的例子結束本部分的學習: #-交互式備份,恢復程序 echo "輸入要備份文件所在目錄:c" read W
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025私企短期用工的合同
- 2025二手商品交易合同
- 2025建筑工程合同的補充協議范本
- 《服務創新》課件 - 探索與實踐的結晶
- 《趙六高血糖》課件
- 杭州互聯網產業報告
- 公關程序之實施與評估
- 人教部編版九年級上冊第8課 西歐莊園教案配套
- 南通職業大學《日語專業導論》2023-2024學年第一學期期末試卷
- 大會新質生產力
- 環境監測課件-第三章水監測-第三節水樣的采集與保存
- 事業單位心理素質測試題
- 初中數學-線段的垂直平分線教學設計學情分析教材分析課后反思
- 光伏電源逆變器的設計畢業論文設計
- 青春期教育(男生)課件
- 抽水臺班記錄表
- 麥格米特與福尼斯高速焊接對比
- Unit+2+Bridging+Cultures+單元整體教學說課課件 高中英語人教版(2019)選擇性必修第二冊單元整體教學設計
- 柱上變壓器施工方案
- 面向繪畫機器人的人臉肖像畫生成
- bp10x硬件設計參考系列datasheet bp1064l2數據手冊
評論
0/150
提交評論