shell編程之執(zhí)行結(jié)構(gòu)
專注于為中小企業(yè)提供成都做網(wǎng)站、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)寧陵免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。case分支選擇結(jié)構(gòu):
case 詞 in [模式 [| 模式] ...) 命令 ;; ] ... esac
case 變量引用 in
模式1)
分支1
;;
模式2)
分支2
;;
...
*)
默認(rèn)分支
;;
esac
模式(PATTERN):
1.普通的文本字符
2.globbing風(fēng)格的通配符
*:任意長度任意字符
?:任意的單個(gè)字符
[]:范圍內(nèi)的任意單個(gè)字符
[^]:范圍外的任意單個(gè)字符
3.|:或
例:提示用戶輸入信息,然后判斷用戶輸入的信息是否合法;
#!/bin/bash # read -p "Please make your choice[yes of no]: " CHOICE case $CHOICE in yes|YES) echo "right." ;; NO|no) echo "wrong." ;; *) echo "Unknow." ;; esac
if的分支結(jié)構(gòu)和case的分支結(jié)構(gòu)之間的區(qū)別:
相同點(diǎn):
1.都是條件為真,執(zhí)行對應(yīng)分支的語句;條件為假,就不執(zhí)行;
2.都可以設(shè)置默認(rèn)分支語句,即:所有條件都不匹配的時(shí)候,所執(zhí)行的語句;
不相同點(diǎn):
1.if是根據(jù)命令的執(zhí)行狀態(tài)返回值來判斷正確與否;case是根據(jù)變量的值的取值內(nèi)容是否匹配模式來判斷正確與否;
2.case的每個(gè)分支都必須使用“;;”結(jié)束;
while與until循環(huán)結(jié)構(gòu):
while
while 命令 ; do 命令 ;done
while CONDITION ; do
循環(huán)體
done
進(jìn)入循環(huán)條件:CONDITION一直為真
退出循環(huán)條件:CONDITION為假
until
until 命令 ; do 命令 ; done
until CONDITION ; do
循環(huán)體
done
進(jìn)入循環(huán)條件:CONDITION一直為假
退出循環(huán)條件:CONDITION為假
其中:while CONDITION ; do CMD ; done 相當(dāng)于 until ! CONDITION ; do CMD ; done
注意: 對于while和until兩個(gè)循環(huán)結(jié)構(gòu)來講,如果要實(shí)施變量增量操作,必須手動(dòng)給出;
例:利用while和until循環(huán)結(jié)構(gòu),計(jì)算100以內(nèi)所有整數(shù)的和;
#!/bin/bash # declare -i I=1 while [ $I -lt 100 ] ; do let SUM+=$I let l++ done echo $SUM #!/bin/bash # declare -i I=1 until [ $I -gt 100 ] ; do let SUM+=$I let I++ done echo $SUM
循環(huán)控制語句:
continue
break
continue:
continue [n]
提前結(jié)束第n層的本次循環(huán),直接進(jìn)入下一輪條件判斷,若符合循環(huán)進(jìn)入條件,則開啟下一輪循環(huán);
break:
break [n]
提前結(jié)束第n層循環(huán);不再繼續(xù)后續(xù)循環(huán);
無限循環(huán)用法:
while true ; do
循環(huán)體
done
until false ; do
循環(huán)體
done
在此類的循環(huán)結(jié)構(gòu)中,必須適當(dāng)?shù)氖褂胏ontinue和break,以保證循環(huán)不會一直持續(xù)下去;
能夠?qū)崿F(xiàn)遍歷功能的while循環(huán);
while read LINES ; do
循環(huán)體
done < /PATH/FROM/SOMEFILE
until ! read LINES ; do
循環(huán)體
done < /PATH/FROM/SOMEFILE
例:文件abc.txt內(nèi)容如下:
1,2,3,5,6
b,d,g,h,e
6,3,7,1,7
f,g,e,y,a
寫一個(gè)腳本,利用循環(huán)結(jié)構(gòu),輸出每一行的第二個(gè)和第四個(gè)字符(以逗號分隔)
#!/bin/bash # while read LINES ; do echo -n $LINES | cut -d, -f2,4 | tr '\n' ',' done < abc.txt
select
select循環(huán)只要用于創(chuàng)建一個(gè)菜單式列表,供用戶進(jìn)行選擇;
列表是按照數(shù)字順序排列的,我們只要選擇數(shù)字即可;
一般來講,select與case一起使用;
seelcet是一個(gè)無限循環(huán)結(jié)構(gòu),因此,必須在循環(huán)體中使用break命令以退出循環(huán),或者可以使用exit命令直接終止腳本運(yùn)行;
select NAME [in 詞語 ...; ] do 命令 ; done
select NAME [in LIST] ; do
命令
done
例子:
#!/bin/bash # select | in meat soap rice vag ; do case $I in meat) echo "I like it." break ;; soap) echo "I don't like it." continue ;; *) exit esac done
shell腳本編程之函數(shù)
systemV風(fēng)格的服務(wù)管理腳本:
給腳本傳遞一些參數(shù):start,stop,restart,status
例:#ssh username@IP
把那些在腳本中重復(fù)出現(xiàn)并且沒有任何改變的代碼,封裝起來,在適當(dāng)?shù)膱鼍爸姓{(diào)用執(zhí)行;
程序員將這種被封裝起來的代碼稱為功能提,或者叫模塊;
function -- 函數(shù)
在shell腳本編程中,函數(shù)是由若干條shell命令組成的語句快,通常用于代碼重用和模塊化封裝;
函數(shù)里面的內(nèi)容和shell程序形式上是一致的;不同之處就是,shell代碼可以直接被執(zhí)行;而函數(shù)中的內(nèi)容,不能獨(dú)立執(zhí)行,只有被調(diào)用的時(shí)候才被執(zhí)行;
函數(shù)是在shell程序的當(dāng)前shell中運(yùn)行的;
定義函數(shù):
函數(shù)是由兩部分組成:函數(shù)名稱+函數(shù)體(能夠?qū)崿F(xiàn)獨(dú)立功能的shell語句塊)
語法一:
function func_name{
函數(shù)體
}
語法二:
func_name(){
函數(shù)體
}
注意:函數(shù)名和()之間不能有空白字符;
函數(shù)的使用:
函數(shù)在定義的時(shí)候,其函數(shù)體中包含的所有命令均不會被執(zhí)行,只有函數(shù)被調(diào)用的時(shí)候,才會執(zhí)行其中的命令語句;
調(diào)用方式:通過直接給出函數(shù)名稱的方式調(diào)用;
有很多的函數(shù)是存放與專門用于保存函數(shù)的文件中,如果想要調(diào)用這樣的文件中保存的函數(shù),使用source命令(.)加載文件,然后再以直接給出函數(shù)名稱的方式調(diào)用函數(shù);
使用set命令可以查看所有當(dāng)前shell中國生效的函數(shù);
使用unset命令可以撤銷已經(jīng)定義的函數(shù);
函數(shù)的返回值:
兩種返回值:
函數(shù)的執(zhí)行結(jié)果的返回值:
1.在函數(shù)體中使用了echo或printf命令輸出結(jié)果;
2.在函數(shù)體中某些命令輸出的結(jié)果;
函數(shù)的狀態(tài)返回值:
1.函數(shù)中最后一跳命令的執(zhí)行狀態(tài)返回值;
2.自定義退出狀態(tài)碼;
return [n]
n:0-255(1 2 127盡可能不適用)
0:表示無錯(cuò)誤返回
1-255:有錯(cuò)誤返回
注意:只要函數(shù)在執(zhí)行是,遇到了return命令,不管函數(shù)中的命令語句是否全部執(zhí)行完成,立刻退出函數(shù);
函數(shù)的聲明周期:
從被調(diào)用開始,到遇到return命令或全部的語句執(zhí)行完成為止;
函數(shù)的實(shí)參:
在函數(shù)體中,可以使用$1,$2,...位置變量為函數(shù)提供參數(shù);還可以使用$*或$@的方式引用所有位置參數(shù);還可以使用$#計(jì)算為函數(shù)傳遞的參數(shù)個(gè)數(shù);
在調(diào)用函數(shù)的時(shí)候,直接在函數(shù)名稱后面以空白字符分隔多個(gè)參數(shù)即可;
比如: func_name arg1 arg2 ...
例子:
#!/bin/bash # addusers(){ for I in {1..5} ; do if id $1$I &> /dev/null | ; then echo "User $1$I exists." return 5 else useradd $1$I &> /dev/null echo $1$I | passwd --stdin $1$I echo "Create user $1$I funished." fi done } addusers $1
傳遞給函數(shù)的位置參數(shù),是調(diào)用函數(shù)的時(shí)候,函數(shù)名稱后面的有空白字符分隔的字符串序列;跟腳本的位置參數(shù)不是一回事;
變量:
shell中的變量為弱變量
1.無需事先聲明
2.無需指定變量類型,默認(rèn)為字符型
變量分類:
環(huán)境變量: 當(dāng)前shell及子shell
本地變量: 當(dāng)前shell
局部變量: local VAR_NAME=VALUE當(dāng)前函數(shù)體
位置變量:
特殊變量:
建議:手動(dòng)銷毀自己定義或聲明的所有變量;
函數(shù)的遞歸調(diào)用
簡單來說,就是在函數(shù)體中調(diào)用函數(shù)自身;
例:階乘:N!=N*(N-1)!=N*(N-1)*(N-2)!=...=N*(N-1)*(N-2)*...*2*1
#!/bin/bash # fact(){ if [ $1 -eq 0 ] || [ $1 -eq 1 ] ; then echo 1 else echo "$[$1*$(fact $[$1-1])]" fi } ehco -n "$1!=" fact $1
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)頁名稱:我的朗科運(yùn)維第八課-創(chuàng)新互聯(lián)
鏈接地址:http://muchs.cn/article24/sppce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、手機(jī)網(wǎng)站建設(shè)、軟件開發(fā)、網(wǎng)站營銷、動(dòng)態(tài)網(wǎng)站、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容