版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第4章Linuxshell程序設(shè)計(jì)
1.
主要內(nèi)容
shell的主要特點(diǎn)、類型、建立和執(zhí)行的方式bash變量的分類、定義形式及引用規(guī)則各種控制語句的格式、功能及流程bash中算術(shù)運(yùn)算的使用bash函數(shù)的構(gòu)成及使用規(guī)則bash中的內(nèi)置命令2.4.1shell概述
4.1.1shell的特點(diǎn)和主要版本作為命令解釋程序一種高級程序設(shè)計(jì)語言,它有變量,關(guān)鍵字,有各種控制語句,如if、case、while、for等語句,支持函數(shù)模塊,有自己的語法結(jié)構(gòu)1.shell的特點(diǎn)組合新命令直接使用shell的內(nèi)置命令結(jié)構(gòu)化的程序模塊可配置的環(huán)境
提供了文件名擴(kuò)展字符靈活地使用數(shù)據(jù)流在后臺執(zhí)行命令高級的命令語言3.2.shell的種類(1)Bourneshell(簡稱sh)(2)Cshell(簡稱csh)(3)Kornshell(簡稱ksh)(4)BourneAgainshell(即bash)4.1shell概述
4.1.1shell的特點(diǎn)和主要版本4.4.1shell概述
4.1.2shell程序示例【例4.1】由三條簡單命令組成的shell程序(文件名為ex1)。$catex1datepwdcd..5.【例4.2】帶有控制結(jié)構(gòu)的shell程序(文件名為ex2)。$catex2#!/bin/bash#Ifnoarguments,thenlistingthecurrentdirectory.#Otherwise,listingeachsubdirectory.iftest$#=0thenls.elseforidols-l$i|grep'^d'donefi4.1shell概述
4.1.2shell程序示例6.4.1shell概述
4.1.3shell腳本的建立和執(zhí)行1.shell腳本的建立建立shell腳本呢的步驟與建立普通文本文件的方式相同,可以利用編輯器(如vi)進(jìn)行程序錄入和編輯加工。2.執(zhí)行shell腳本的方式執(zhí)行shell腳本的方式基本上有三種:
(1)輸入定向到shell腳本
$bash<腳本名7.4.1shell概述
4.1.3shell腳本的建立和執(zhí)行2.執(zhí)行shell腳本的方式
(2)以腳本名作為參數(shù)其一般形式是:$bash腳本名[參數(shù)]如果以目前shell(以·表示)執(zhí)行一個shell腳本,則可以使用如下簡便形式:
$·
腳本名[參數(shù)]
(3)將shell腳本的權(quán)限設(shè)置為可執(zhí)行,然后在提示符下直接執(zhí)行它。
$chmoda+xex2$PATH=$PATH:.$ex2注意:此時該腳本所在的目錄應(yīng)被包含在命令搜索路徑(PATH)中8.4.2命令歷史
4.2.1顯示歷史命令語法格式是:history[option][arg…]如果不帶任何參數(shù),則history命令會顯示歷史命令的清單如果history后給出一個正整數(shù)(如50),就只顯示歷史表中的最后50行命令如果history后給出一個文件名,就把它作為歷史文件名常用的選項(xiàng)有:
-a在歷史文件中添加“新”歷史命令行。
-n從歷史文件中讀取尚未讀入的歷史命令行,添加到當(dāng)前歷史清單中。
-r讀取歷史文件的內(nèi)容,并把它作為當(dāng)前的歷史命令。
-w把當(dāng)前的歷史寫到歷史文件中,覆蓋原有內(nèi)容。
-c刪除歷史清單中所有的項(xiàng)。
9.4.2命令歷史
4.2.2執(zhí)行歷史命令執(zhí)行歷史命令是命令替換之一,它以字符“!”開頭、后隨1個或多個字符來定義用戶所需的某種類型的歷史命令基本的事件指定字格式
格式
意義!!重復(fù)上一條命令,也就是“!-1”
!n重新執(zhí)行第n條歷史命令!-n重新執(zhí)行倒數(shù)第n條歷史命令。!-1就等于!!!string重新執(zhí)行以字符串string開頭的最近的歷史命令行。!?string?重新執(zhí)行最近的、包含字符串string的那條歷史命令!#到現(xiàn)在為止所輸入的整個命令行10.4.2命令歷史
4.2.3配置歷史命令環(huán)境在默認(rèn)方式下,bash使用用戶主目錄下面的文件“.bash_history”來保存命令歷史改變存放歷史命令的文件
$HISTFILE="/home/mengqc/.myhistory"重新設(shè)定能夠保留的命令個數(shù)
$HISTSIZE=60011.
4.3名稱補(bǔ)全
可以輸入目錄名或文件名的開頭部分,然后按Tab鍵,Linux根據(jù)輸入的字母查找以這些字母開頭的目錄或文件,并自動補(bǔ)全剩余的部分。12.4.4別名
4.4.1定義別名一般語法格式為:alias[name[=value]]…如果沒有指定參數(shù),將在標(biāo)準(zhǔn)輸出(屏幕)上顯示別名清單定義別名時,往往用單引號將它代表的內(nèi)容括起來,從而防止shell對其中的內(nèi)容產(chǎn)生歧義,如對空格和特殊字符另作解釋13.4.4別名
4.4.2取消別名如果想取消先前定義的別名,可使用如下命令:
unaliasname…可以一次將所有的別名都從別名表中刪除,使用如下命令:
unalias-a
14.
4.5shell特殊字符
4.5.1通配符1.一般通配符*(星號),它匹配任意字符的0次或多次出現(xiàn)?(問號),它匹配任意一個字符[](一對方括號),其中有一個字符組。其作用是匹配該字符組所限定的任何一個字符!(驚嘆號),如果它緊跟在一對方括號的左方括號([)之后,則表示不在一對方括號中所列出的字符
15.
4.5shell特殊字符
4.5.1通配符2.模式表達(dá)式
——是那些包含一個或多個通配符的字*(模式表)——匹配給定模式表中“模式”的0次或多次出現(xiàn),各模式之間以“|”分開(下同)+(模式表)——匹配給定模式表中“模式”的1次或多次出現(xiàn)?(模式表)——匹配模式表中任何一種“模式”的0次或1次出現(xiàn)@(模式表)——僅匹配模式表中給定“模式”的一次出現(xiàn)!(模式表)——除給定模式表中的一個“模式”之外,可以匹配其他任何東西
16.4.5shell特殊字符
4.5.2引號1.雙引號由雙引號括起來的字符(除$、倒引號(`)和反斜線(\)外)均作為普通字符對待。2.單引號由單引號括起來的字符都作為普通字符出現(xiàn)3.倒引號倒引號括起來的字符串被shell解釋為命令行,在執(zhí)行時,shell會先執(zhí)行該命令行,并以它的標(biāo)準(zhǔn)輸出結(jié)果取代整個倒引號部分。倒引號還可以嵌套使用。但應(yīng)注意,嵌套使用時內(nèi)層的倒引號必須用反斜線(\)將其轉(zhuǎn)義。
17.4.5shell特殊字符
4.5.3輸入/輸出重定向符
自動打開三個標(biāo)準(zhǔn)文件,即標(biāo)準(zhǔn)輸入文件(stdin),標(biāo)準(zhǔn)輸出文件(stdout)和標(biāo)準(zhǔn)出錯輸出文件(stderr)。
1.輸入重定向符
一般形式是:命令<文件名如:$score<file12.輸出重定向符一般形式是:命令>文件名如:$who>abc3.輸出附加定向符一般形式是:命令>>文件名如:$ps-l>>psfile18.輸入和輸出重新定向可以連在一起使用。例如:
$wc-l<infile>outfile4.即時文件定向符即時文件的形式是:
命令[參數(shù)]<<標(biāo)記符輸入行
…
標(biāo)記符
注意:標(biāo)記符要成對出現(xiàn)
例如:
mail$1<<!!
Bestwishestoyouonyourbirthday.!!4.5shell特殊字符
4.5.3輸入/輸出重定向符19.5.與文件描述字有關(guān)的重定向系統(tǒng)為每個進(jìn)程自動打開三個標(biāo)準(zhǔn)文件(即標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和錯誤輸出),其文件描述字分別為0,1和2。標(biāo)準(zhǔn)錯誤輸出也可重定向到一個文件中,其一般形式是:命令2>文件名命令2>>文件名標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出可以重定向到同一個文件,一般形式是:
command$>file
等價(jià)于下面形式的命令:
command>file2>&14.5shell特殊字符
4.5.3輸入/輸出重定向符20.4.5shell特殊字符
4.5.4注釋、管道線和后臺命令
1.注釋
#!/bin/bash#Ifnoarguments,thenlistingthecurrentdirectory.#Otherwise,listingeachsubdirectory.2.管道線
ls-l$HOME|wc–lls|grepm?.c|wc–l3.后臺命令
$gccm1.c&21.4.5shell特殊字符
4.5.5命令執(zhí)行操作符1.順序執(zhí)行
在執(zhí)行時,以分號隔開的各條命令從左到右依次執(zhí)行
pwd;who|wc-l;cd/usr/bin2.邏輯與命令1&&命令2其功能是,先執(zhí)行命令1,如果執(zhí)行成功,才執(zhí)行命令2;否則,若命令1執(zhí)行不成功,則不執(zhí)行命令2。3.邏輯或命令1||命令2其功能是,先執(zhí)行命令1,如果執(zhí)行不成功,則執(zhí)行命令2;否則,若命令1執(zhí)行成功,則不執(zhí)行命令2。22.4.5shell特殊字符
4.5.6成組命令1.{}形式以花括號括起來的全部命令可視為語法上的一條命令,出現(xiàn)在管道符的一邊。
${echo“UserReportfor`date`.”;who;}|pr
使用花括號時在格式上應(yīng)注意:左括號“{”后面應(yīng)有一個空格;右括號“}”之前應(yīng)有一個分號(;)2.()形式
(echo"Currentdirectoryis`pwd`."cd/home/mengqc;ls-l;cpm1em1&&rmm1catem1)|pr23.
二者存在重要區(qū)別:用花括號括起來的成組命令只是在本shell內(nèi)執(zhí)行命令表,不產(chǎn)生新的進(jìn)程;用圓括號括起來的成組命令是在新的子shell內(nèi)執(zhí)行,要建立新的子進(jìn)程。
4.5shell特殊字符
4.5.6成組命令24.4.6shell變量
4.6.1用戶定義的變量
1.變量名是以字母或下線符打頭的字母、數(shù)字和下線符序列,并且大小寫字母意義不同。2.定義變量并賦值的一般形式是:
變量名=字符串3.引用變量值在變量名前面加上一個符號“$”
如果在賦給變量的值中要含有空格、制表符或換行符,那么,就應(yīng)該用雙引號把這個字符串括起來。
$names="ZhangsanLisiWangwu"$echo$names25.如果變量值須出現(xiàn)在長字符串的開頭或者中間,為了使變量名與其后的字符區(qū)分開,避免shell把它與其它字符混在一起視為一個新變量,則應(yīng)該用花括號將該變量名括起來。例如,
$dir=/usr/meng$cat${dir}qc/m1.c4.命令替換有兩種形式的命令替換:一種是使用倒引號引用命令,其一般形式是:
`命令表`另一種形式是:
$(命令表)
如:$dir=$(pwd)$echo$(pwd;cd/home/mengqc;ls-d)4.6shell變量
4.6.1用戶定義的變量
26.4.6shell變量
4.6.2數(shù)組bash只提供一維數(shù)組,并且沒有限定數(shù)組的大小。類似與C語言,數(shù)組元素的下標(biāo)由0開始編號。對數(shù)組元素賦值的一般形式是:數(shù)組名[下標(biāo)]=值可以用declare命令顯式聲明一個數(shù)組,一般形式是:
declare-a數(shù)組名讀取數(shù)組元素值的一般格式是:
${數(shù)組名[下標(biāo)]}27.4.6shell變量
4.6.2數(shù)組定義一個數(shù)組并為其賦初值的一般形式是:
數(shù)組名=(值1值2…
值n)
其中,各個值之間以空格分開。若沒有給出數(shù)組元素的下標(biāo),則數(shù)組名表示下標(biāo)為0的數(shù)組元素使用*或@當(dāng)作下標(biāo),則會以數(shù)組中所有元素取代[*]或[@]28.4.6shell變量
4.6.3變量引用有效的變量引用表達(dá)式有以下形式:$name${name#pattern}${name}${name##pattern}${name[n]}${name%pattern}${name[*]}${name%%pattern}${name[@]}${#@}${name:-word}${$#*}${name:=word}${#name}${name:?word}${#name[*]}${name:+word}${#name[@]}29.①表達(dá)式$name表示變量name的值,若變量未定義,則用空值替換。②表達(dá)式${name}將被變量name的值替換。用花括號括起name,目的在于把變量名與后面的字符分隔開,避免出現(xiàn)混淆。替換后花括號被取消。③${name[n]}表示數(shù)組變量name中第n個元素的值。4.6shell變量
4.6.3變量引用30.④表達(dá)式${name[*]}和${name[@]}都表示數(shù)組name中所有非空元素的值,每個元素的值用空格分開。如果用雙引號把它們都括起來,那么二者的含義就有區(qū)別:對于“${name[*]}”,它被擴(kuò)展成一個詞(即字符串),這個詞由以空格分開的各個數(shù)組元素組成;對于“${name[@]}”,它被擴(kuò)展成多個詞,每個數(shù)組元素是一個詞。如果數(shù)組name中沒有元素,則${name[@]}被擴(kuò)展為空串。⑤表達(dá)式${name:-word}、${name:=word}、${name:+word}、${name:?word}的計(jì)算方法在4.7節(jié)中介紹4.6shell變量
4.6.3變量引用31.⑥表達(dá)式${name#pattern}和${name##pattern}
如果pattern(Shell模式)與name值的開頭匹配,那么name的值去掉匹配部分后的結(jié)果就是該表達(dá)式的值;否則,name的值就是該表達(dá)式的值。在第一種格式中,name值去掉的部分是與pattern匹配的最少的部分;而第二種格式中,name值去掉的部分是與pattern匹配的最多的部分。4.6shell變量
4.6.3變量引用32.⑦表達(dá)式${name%pattern}和${name%%pattern}
如果pattern與name值的末尾匹配,那么name的值中去掉匹配部分后的結(jié)果就是該表達(dá)式的值;否則,該表達(dá)式的值就是name的值。在第一種格式中,去掉的部分是最少的匹配部分;而第二種格式中,去掉的部分是最多的匹配部分。4.6shell變量
4.6.3變量引用33.⑧表達(dá)式${#@}和${#*}
它們的值分別是由$@和$*返回的參數(shù)的個數(shù)。⑨表達(dá)式${#name[i]}
該表達(dá)式的值是數(shù)組name第i個元素值的長度(字符個數(shù))。⑩表達(dá)式${#nane[*]}和${#name[@]}
它們的值都是數(shù)組name中已經(jīng)設(shè)置的元素的個數(shù)。4.6shell變量
4.6.3變量引用34.4.6shell變量
4.6.4輸入/輸出命令1.read命令可以利用read命令從鍵盤上讀取數(shù)據(jù),然后賦給指定的變量。read命令的一般格式是:
read變量1[變量2…]變量個數(shù)與給定數(shù)據(jù)個數(shù)相同,則依次對應(yīng)賦值變量個數(shù)少于數(shù)據(jù)個數(shù),則從左至右對應(yīng)賦值,但最后一個變量被賦予剩余的所有數(shù)據(jù)。變量個數(shù)多于給定數(shù)據(jù)個數(shù),則依次對應(yīng)賦值,而沒有數(shù)據(jù)與之對應(yīng)的變量取空串35.2.echo命令顯示其后的變量值或者直接顯示它后面的字符串如果echo命令帶有選項(xiàng)“-e”,那么在其后的參數(shù)中可以有以下轉(zhuǎn)義字符:\a\b\c\e\f\n\r\t\v\\\m\xm4.6shell變量
4.6.4輸入/輸出命令【例4.6】這是一個特洛伊木馬shell腳本示例。
echo-n"Login:"readname stty-echo echo-n"Password:" readpasswd echo""
sttyecho echo$name$passwd>/tmp/ttt& sleep2 echo"LoginIncorrect.Re-enter,Please." sttycooked36.4.6shell變量
4.6.5位置參數(shù)1.位置參數(shù)及其引用位置變量的名稱很特別,分別是0,1,2,…
命令行實(shí)參與腳本中位置變量的對應(yīng)關(guān)系如下所示:
exam1m1m2m3m4$0$1$2$3$4$5$6$7$8$9${10}${11}
引用它們的方式依次是$0,$1,$2,…,$9,${10},${11}等。其中,$0始終表示命令名或shell腳本名。位置變量不能通過一般賦值的方式直接賦值通過命令行上對應(yīng)位置的實(shí)參傳值
2.用set命令為位置參數(shù)賦值37.4.6shell變量
4.6.6移動位置參數(shù)每執(zhí)行一次shift命令,就把命令行上的實(shí)參向左移一位,即相當(dāng)于位置參數(shù)向右移動一個位置。命令行:ex7 A BC DE F
原位置參數(shù):$0 $1 $2$3 $4$5$6移位后位置參數(shù):$0 $1$2 $3$4 $5shift命令不能將$0移走,所以經(jīng)shift右移位置參數(shù)后,$0的值不會發(fā)生變化。shift命令可以帶有一個整數(shù)作為參數(shù)38.4.6shell變量
4.6.7預(yù)先定義的特殊變量$#命令行上參數(shù)的個數(shù),但不包含shell腳本名本身。因此,$#可以給出實(shí)際參數(shù)的個數(shù)。$?上一條命令執(zhí)行后的返回值(也稱作“返回碼”、“退出狀態(tài)”、“退出碼”等)。它是一個十進(jìn)制數(shù)。$$當(dāng)前進(jìn)程的進(jìn)程號。$!上一個后臺命令對應(yīng)的進(jìn)程號,這是一個由1~5位數(shù)字構(gòu)成的數(shù)字串。39.4.6shell變量
4.6.7預(yù)先定義的特殊變量$-由當(dāng)前shell設(shè)置的執(zhí)行標(biāo)志名組成的字符串。$*表示在命令行中實(shí)際給出的所有實(shí)參字符串,它并不僅限于9個實(shí)參。$@它與$*基本功能相同,即表示在命令行中給出的所有實(shí)參。但“$@”與“$*”不同。40.4.6shell變量
4.6.8環(huán)境變量1.常用的環(huán)境變量HOME:用戶主目錄的全路徑名LOGNAME:即你的注冊名,由Linux自動設(shè)置MAIL: 你的系統(tǒng)信箱的路徑PATH: shell從中查找命令的目錄列表??梢栽O(shè)置它,如:PATH=$PATH:$HOME/binPS1:shell的主提示符。bash默認(rèn)的主提示符一般為“\s-\v\$”。其中,\s表示shell的名稱;\v表示bash的版本號
PS1="EnterCommand>"PWD:你當(dāng)前工作目錄的路徑SHELL:你當(dāng)前使用的shellTERM: 你的終端類型41.2.使用環(huán)境變量如果要使用環(huán)境變量或其它shell變量的值,必須在變量名之前加上一個“$”符號,不能直接使用變量名。如:cd$HOME3.刪除環(huán)境變量$unsetNAME4.6shell變量
4.6.8環(huán)境變量42.4.6shell變量
4.6.9環(huán)境文件bash的環(huán)境文件包括.bash_profile文件、.bashrc文件、.bash_logout文件等。在.bash_profile中,設(shè)置了環(huán)境變量和文件掩碼(umask)名為.bashrc的腳本,每次啟動bash時便會執(zhí)行它。它只含有針對bash的命令,可以用來設(shè)置別名。.bashrc在.bash_profile之后執(zhí)行.bash_logout,它僅在退出注冊的時候運(yùn)行43.4.6shell變量
4.6.10export語句與環(huán)境設(shè)置1.export語句一個進(jìn)程在自己的環(huán)境中定義的變量是局部變量,僅限于自身范圍,不能自動傳給其子進(jìn)程。就是說,子進(jìn)程只能繼承父進(jìn)程的公用區(qū)和轉(zhuǎn)出區(qū)中的數(shù)據(jù),而每個進(jìn)程的數(shù)據(jù)區(qū)和棧區(qū)是私有的,不能繼承。為了使其后的各個子進(jìn)程能繼承父進(jìn)程中定義的變量,就必須用export(轉(zhuǎn)出)命令將這些變量送入進(jìn)程轉(zhuǎn)出區(qū)。export命令的一般使用形式是:export[變量名]44.2.環(huán)境變量的設(shè)置和顯示設(shè)置變量要用如下形式:變量名=值如果變量值的字符串中帶有空格等特殊字符,需要用引號把整個字符串括起來。例如:$PS1="OK>"利用export命令將這些變量輸出,使它們成為公用量。如:
exportHOMEHZLOGNAMETERM可以利用env命令列出所有的環(huán)境變量,包括本進(jìn)程及以前的“祖先進(jìn)程”所輸出的變量4.6shell變量
4.6.10export語句與環(huán)境設(shè)置45.3.set命令set命令的功能主要有三個:⑴顯示迄今為止所定義的全部變量,包括局部量和公用量;⑵用來設(shè)定位置參數(shù)的值;⑶改變執(zhí)行shell腳本時的選項(xiàng)設(shè)定,可以使用戶改變shell的功能。設(shè)置標(biāo)志的一般形式是:set-標(biāo)志例如:set-x關(guān)閉標(biāo)志的一般形式是:set+標(biāo)志例如:set+x4.6shell變量
4.6.10export語句與環(huán)境設(shè)置46.4.7參數(shù)置換變量是另一種為變量賦值的方式,其一般形式是:變量2=${變量1op字符串}其中,op表示操作符,它可以是下列四個操作符之一:
:-:=:+:?變量2的值取決于變量1(參數(shù))是否為空串、利用哪個操作符以及字符串的取值。在操作符的前后不留空格!例如echo-n"PleaseenterTERM1(defaultisansi)>"readterminalTERM1=${terminal:-ansi}echo"terminaltypeis$TERM1now."echo"terminal=$terminal"47.
表4.2四種參數(shù)置換變量的格式與功能
格式var1為空var1不為空var2=${var1:-string}var2=string,var1不變var2=$var1,var1不變var2=${var1:=string}var2=stringvar1=stringvar2=$var1var1不變var2=${var1:+string}var2為空,var1不變var2=string,var1不變var2=${var1:?string}輸出格式:腳本名:var1:string并退出shellvar2不變var2=$var1,var1不變4.7參數(shù)置換變量48.4.8算術(shù)運(yùn)算bash中執(zhí)行整數(shù)算術(shù)運(yùn)算的命令是let,其語法格式為:
letarg…其中arg是單獨(dú)的算術(shù)表達(dá)式。它使用C語言中表達(dá)式的語法、優(yōu)先級和結(jié)合性。除++、--和逗號(,)之外,所有整型運(yùn)算符都得到支持,此外,還提供了方冪運(yùn)算符“**”。在算術(shù)表達(dá)式中直接利用名稱訪問命名的參數(shù),不要前面帶有“$”符號let命令的替代表示形式是:
((算術(shù)表達(dá)式))49.4.8算術(shù)運(yùn)算例如:
let″j=i*6+2″
等價(jià)于:((j=i*6+2))
如果表達(dá)式的值是非0,那么返回的狀態(tài)值是0;否則,返回的狀態(tài)值是1。當(dāng)表達(dá)式中有shell的特殊字符時,必須用雙引號將其括起來。例如,let″val=a|b″只有使用$((算術(shù)表達(dá)式))
形式才能返回表達(dá)式的值50.4.9控制結(jié)構(gòu)
4.9.1if語句if語句用于條件控制結(jié)構(gòu)中,其一般格式為:
if測試條件
then命令1else命令2fi其中,if、then、else和fi是關(guān)鍵字。例如:
iftest-f"$1"thenecho"$1isanordinaryfile."elseecho"$1isnotanordinaryfile."fi51.if語句中else部分可以缺省。例如,
iftest-f"$1"thenecho"$1isanordinaryfile."fiif語句的else部分還可以是else—if結(jié)構(gòu),則用關(guān)鍵字“elif”代替“elseif”。例如,
iftest-f"$1"thenpr$1eliftest-d"$1"then(cd$1;pr*)elseecho"$1isneitherafilenoradirectory."fi4.9控制結(jié)構(gòu)
4.9.1if語句52.if的語句的更一般形式是:
if命令表1then命令表2else命令表3fi4.9控制結(jié)構(gòu)
4.9.1if語句53.4.9控制結(jié)構(gòu)
4.9.2條件測試條件測試有三種常用形式:一種是用test命令。另一種是用一對方括號將測試條件括起來。這兩種形式是完全等價(jià)的。例如,測試位置參數(shù)$1是否是已存在的普通文件,可寫為:
test-f"$1"
也完全可寫成:[-f"$1"]第三種形式是:[[條件表達(dá)式]]test命令可以和多種系統(tǒng)運(yùn)算符一起使用。這些運(yùn)算符可以分為四類:文件測試運(yùn)算符、字符串測試運(yùn)算符、數(shù)值測試運(yùn)算符和邏輯運(yùn)算符。54.1.有關(guān)文件方面的測試
參數(shù)
功能-r文件名若文件存在并且是用戶可讀的,則測試條件為真-w文件名若文件存在并且是用戶可寫的,則測試條件為真-x文件名若文件存在并且是用戶可執(zhí)行的,則測試條件為真-f文件名若文件存在并且是普通文件,則測試條件為真-d文件名若文件存在并且是目錄文件,則測試條件為真-p文件名若文件存在并且是命名的FIFO文件,則測試條件為真-b文件名若文件存在并且是塊設(shè)備文件,則測試條件為真-c文件名若文件存在并且是字符設(shè)備文件,則測試條件為真-s文件名若文件存在并且文件的長度大于0,則測試條件為真-t文件描述字若文件被打開且其文件描述字是與終端設(shè)備相關(guān)的,則測試條件為真。默認(rèn)的“文件描述字”是14.9控制結(jié)構(gòu)
4.9.2條件測試55.2.有關(guān)字符串方面的測試
參數(shù)
功能-zs1如果字符串s1的長度為0,則測試條件為真。-ns1如果字符串s1的長度大于0,則測試條件為真。s1如果字符串s1不是空字符串,則測試條件為真。s1=s2如果s1等于s2,則測試條件為真?!埃健币部梢杂谩埃剑健贝妗T凇埃健鼻昂髴?yīng)有空格。s1!=s2如果s1不等于s2,則測試條件為真。s1<s2如果按字典順序s1在s2之前,則測試條件為真s1>s2如果按字典順序s1在s2之后,則測試條件為真4.9控制結(jié)構(gòu)
4.9.2條件測試56.3.有關(guān)數(shù)值方面的測試
參數(shù)
功能n1-eqn2如果整數(shù)n1等于n2,則測試條件為真n1-nen2如果整數(shù)n1不等于n2,則測試條件為真n1-ltn2如果n1小于n2,則測試條件為真n1-len2如果n1小于或等于n2,則測試條件為真n1-gtn2如果n1大于n2,則測試條件為真n1-gen2如果n1大于或等于n2,則測試條件為真4.9控制結(jié)構(gòu)
4.9.2條件測試57.4.邏輯運(yùn)算符
上述測試條件可以在if語句或循環(huán)語句中單個使用,也可以通過邏輯運(yùn)算符把它們組合起來使用??梢栽跍y試語句中使用的邏輯運(yùn)算符有:
!邏輯非(NOT),它放在任意邏輯表達(dá)式之前,使原來為真的表達(dá)式變?yōu)榧伲乖瓉頌榧俚淖優(yōu)檎?。例如?/p>
[!-r$1],!test-r“$1”等。
-a邏輯與(AND),它放在兩個邏輯表達(dá)式中間,僅當(dāng)兩個表達(dá)式都為真時,結(jié)果才為真。例如,
[-f"$myfile"-a-r"myfile"]-o邏輯或(OR),它放在兩個邏輯表達(dá)式中間,其中只要有一個表達(dá)式為真,結(jié)果就為真。例如,
["$a"-ge0-o"$b"-le100]4.9控制結(jié)構(gòu)
4.9.2條件測試58.(表達(dá)式)圓括號,它可以把一個邏輯表達(dá)式括起來,使之成為一個整體,優(yōu)先得到運(yùn)算。例如,
[\("$a"-ge0\)-a\("$b"-le100\)]邏輯表達(dá)式中的條件測試運(yùn)算符優(yōu)先級高于“!”
運(yùn)算符,“!”
運(yùn)算符的優(yōu)先級高于“
-a”運(yùn)算符,“-a”運(yùn)算符高于“-o”,而且圓括號()高于“-a”5.特殊條件測試(1):表示不做任何事情,其退出值為0。(2)true表示總為真,其退出值總是0。(3)false表示總為假,其退出值是255。4.9控制結(jié)構(gòu)
4.9.2條件測試59.4.9控制結(jié)構(gòu)
4.9.3case語句case語句允許進(jìn)行多重條件選擇。其一般語法形式是:
case字符串in
模式字符串1)命令
…
命令;;
模式字符串2)命令
…
命令;;
…
模式字符串n)命令
…
命令;;esac60.在使用case語句時應(yīng)注意:⑴每個模式字符串后面可有一條或多條命令,其最后一條命令必須以兩個分號(即;;)結(jié)束。⑵模式字符串中可以使用通配符⑶如果一個模式字符串中包含多個模式,那么各模式之間應(yīng)以豎線(|)隔開,表示各模式是“或”的關(guān)系,即只要給定字符串與其中一個模式相配,就會執(zhí)行其后的命令表4.9控制結(jié)構(gòu)
4.9.3case語句61.⑷各模式字符串應(yīng)是唯一的,不應(yīng)重復(fù)出現(xiàn)。并且要合理安排它們的出現(xiàn)順序。⑸case語句以關(guān)鍵字case開頭,以關(guān)鍵字esac(是case倒過來寫!)結(jié)束。⑹case的退出(返回)值是整個結(jié)構(gòu)中最后執(zhí)行的那個命令的退出值。若沒有執(zhí)行任何命令,則退出值為零4.9控制結(jié)構(gòu)
4.9.3case語句62.4.9控制結(jié)構(gòu)
4.9.4while語句shell中有三種用于循環(huán)的語句,它們是:while語句、for語句和until語句。while語句的一般形式是:
while測試條件
do
命令表
done測試條件部分除使用test命令或等價(jià)的方括號外,還可以是一組命令。根據(jù)其最后一個命令的退出值決定是否進(jìn)入循環(huán)體執(zhí)行。63.4.9控制結(jié)構(gòu)
4.9.5until語句until語句的一般形式是:
until測試條件
do
命令表
done它與while語句很相似,只是測試條件不同:當(dāng)測試條件為假時,才進(jìn)入循環(huán)體,直至測試條件為真時終止循環(huán)。64.4.9控制結(jié)構(gòu)
4.9.6for語句其使用方式主要有兩種:一種是值表方式另一種是算術(shù)表達(dá)式方式1.值表方式其一般格式是:
for變量[in值表];do命令表;done根據(jù)循環(huán)變量的取值方式,其使用格式可分為三種:格式一:
for變量in值表
do
命令表
done65.格式二:
for變量in文件正則表達(dá)式
do
命令表
done格式三:
foriin$*或者foridodo
命令表命令表
donedone4.9控制結(jié)構(gòu)
4.9.6for語句66.2.算術(shù)表達(dá)式方式其一般格式是:
for((e1;e2;e3));do命令表;done或者
for((e1;e2;e3))do
命令表
done
其中,e1,e2,e3是算術(shù)表達(dá)式。它的執(zhí)行過程與C語言中for語句相似,即:①先按算術(shù)運(yùn)算規(guī)則計(jì)算表達(dá)式e1;②接著計(jì)算e2,如果e2值不為0,則執(zhí)行命令表中的命令,并且計(jì)算e3;然后重復(fù)②,直至e2為0,退出循環(huán)。
4.9控制結(jié)構(gòu)
4.9.6for語句67.4.9控制結(jié)構(gòu)
4.9.7break命令和continue命令1.break命令
break命令使程序從循環(huán)體中退出來。其語法格式是:
break[n]2.continue命令
continue命令跳過循環(huán)體中在它之后的語句,回到本層循環(huán)的開頭,進(jìn)行下一次循環(huán)。其語法格式是:
continue[n]68.4.9控制結(jié)構(gòu)
4.9.8exit命令exit命令的功能是立即退出正在執(zhí)行的shell腳本,并設(shè)定退出值。其語法格式是:
exit[n]69.4.9控制結(jié)構(gòu)
4.9.9select語句select語句通常用于菜單的設(shè)計(jì),它自動完成接收用戶輸入的整個過程,包括顯示一組菜單項(xiàng)以及讀入用戶的選擇。select語句的語法形式為:
selectidentifier[inword…]do
命令表
done
如果inword…這一部分被省略,那么參數(shù)identifier就以位置參數(shù)($1,$2,…)作為給定的值。70.4.10函數(shù)在shell腳本中可以定義并使用函數(shù)。其定義格式為:
[function]函數(shù)名(){
命令表
}函數(shù)應(yīng)先定義,后使用。調(diào)用函數(shù)時,直接利用函數(shù)名,如showfile,不必帶圓括號shell腳本與函數(shù)間的參數(shù)傳遞可利用位置參數(shù)和變量直接傳遞通常,函數(shù)中的最后一個命令執(zhí)行之后,就退出被調(diào)函數(shù)。也可利用return命令立即退出函數(shù),其語法格式是:
return[n]71.4.11作業(yè)控制執(zhí)行命令set-omonitor,則交互式shell就實(shí)施作業(yè)管理。作業(yè)管理的命令有jobs,kill,bg,fg和wait。4.11.1jobs命令
不帶參數(shù)時,可列出當(dāng)前尚未完成的作業(yè)。例如:
$jobs[2]+Done who|wc-cd[1]-Stopped(SIGTTOU)manls&72.4.11作業(yè)控制
4.11.2kill命令使用kill命令可以向指定的進(jìn)程發(fā)送TERM(終止)信號或者指定的信號。其中一些信號可以使作業(yè)中止運(yùn)行。例如:kill-91893信號可以由信號號碼(sig)或者信號名(signame)指定。利用kill-l命令可以列出全部信號名。73.4.11作業(yè)控制
4.11.3bg和fg命令
bg命令可以把前臺作業(yè)切換成后臺作業(yè)其語法格式是:
bg[job…]fg命令可以把后臺作業(yè)切換成前臺作業(yè)其語法格式是:
fg[job…]僅當(dāng)作業(yè)控制被激活,這些命令才起作用
74.4.12shell內(nèi)置命令
這些命令構(gòu)造在shell內(nèi)部,從而在shell進(jìn)程內(nèi)執(zhí)行。已在前面介紹過的內(nèi)置命令::,.filename,break[n],continue[n],cd,echo,exit[
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高考語文復(fù)習(xí)知識清單第九章語言文字運(yùn)用專題13圖文轉(zhuǎn)換(學(xué)生版+教師版)
- 自律的課件教學(xué)課件
- 三年級數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)附答案
- 網(wǎng)店和解協(xié)議書(2篇)
- 南京航空航天大學(xué)《電力電子理論與方法》2023-2024學(xué)年期末試卷
- 南京工業(yè)大學(xué)浦江學(xué)院《食品工藝學(xué)》2022-2023學(xué)年第一學(xué)期期末試卷
- 農(nóng)業(yè)示范區(qū)景觀工程施工組織設(shè)計(jì)
- 顏公河干流整治工程施工組織設(shè)計(jì)
- 南京工業(yè)大學(xué)浦江學(xué)院《結(jié)構(gòu)力學(xué)》2021-2022學(xué)年第一學(xué)期期末試卷
- 《小數(shù)的性質(zhì)》小學(xué)數(shù)學(xué)說課稿
- 心外科工作制度(12項(xiàng)工作制度)
- 課堂大比武活動總結(jié)
- 2023學(xué)年完整公開課版夜黑黑
- 優(yōu)雅小主婦的美容養(yǎng)顏經(jīng)
- 初中藝術(shù)鄂教七年級上冊漫步藝術(shù)長廊舞劇欣賞《永不消逝的電波》
- 第章WindowsServer網(wǎng)絡(luò)應(yīng)用服務(wù)器
- 景區(qū)解說系統(tǒng)
- 注冊電子郵箱PT課件
- 一年級語文學(xué)年第一學(xué)期期中質(zhì)量分析報(bào)告
- 擇菜洗菜我能行
- VTE的預(yù)防和護(hù)理PPT演示課件
評論
0/150
提交評論