shell腳本的進(jìn)階

一:條件選擇if語(yǔ)句

注意:if語(yǔ)句可嵌套

單分支:

if 判斷條件;then

? ? ? ? ? 條件為真的分支代碼

fi

雙分支:

if 判斷條件;the

? ? ? ?條件為真的分支代碼

else

條件為假的分支代碼

fi

多分支

if 判斷條件1;then

? ? ? ? 條件為真的分支代碼

elif 判斷條件2;then

? ? ? ? ? 條件為真的分支代碼

elif 判斷條件3;then

? ? ? ? ? ? 條件為真的分支代碼

else

? ? ? ? ? ? 以上條件都為假的分支代碼

fi

注:逐條件進(jìn)行判斷,第一次遇為“真”條件時(shí),執(zhí)行奇分支,然后結(jié)束整個(gè)if語(yǔ)句

針對(duì)上述條件的練習(xí)題;

1,編寫(xiě)腳本/root/bin/createuser.sh,實(shí)現(xiàn)如下功能:使用一個(gè)用戶(hù)名做為參 數(shù),如果指定參數(shù)的用戶(hù)存在,就顯示其存在,否則添加之;顯示添加的用戶(hù) 的id號(hào)等信息


腳本示例


執(zhí)行結(jié)果

2,編寫(xiě)腳本/root/bin/checkint.sh,判斷用戶(hù)輸入的參數(shù)是否為正整數(shù)


腳本示例


執(zhí)行結(jié)果

二:條件判斷:case語(yǔ)句

語(yǔ)法格式:

case 變量引用 in

PATH1)

? ? ? ? 分支1

? ? ? ? ;;

PATH2)

? ? ? ? ? ? 分支2

? ? ? ? ? ? ? ? ;;

........

*)

默認(rèn)分支

? ? ? ? ;;

esac????

注:case支持glob風(fēng)格的通配符:

*:任意長(zhǎng)度的任意字符

?:任意單個(gè)字符

[]:指定范圍內(nèi)的任意單個(gè)字符

a|b:a或b

1,針對(duì)上述語(yǔ)句的練習(xí)題示范

2、編寫(xiě)腳本/root/bin/yesorno.sh,提示用戶(hù)輸入yes或no,并判斷用戶(hù)輸入的 是yes還是no,或是其它信息


腳本示例


執(zhí)行效果

2,編寫(xiě)腳本/root/bin/filetype.sh,判斷用戶(hù)輸入文件路徑,顯示其文件類(lèi)型 (普通,目錄,鏈接,其它文件類(lèi)型)


腳本示例


執(zhí)行效果

三,循環(huán)

循環(huán)執(zhí)行

? ? 將某段代碼重復(fù)運(yùn)行多次

? ? 重復(fù)運(yùn)行多少次

? ? 循環(huán)次數(shù)事先已知

? ? 循環(huán)次數(shù)事先未知

有進(jìn)入條件和退出條件

循環(huán)又分為三種:for,while,until

1,for循環(huán)

語(yǔ)法格式

for 變量名 in 列表;do

? ? ? ? 循環(huán)體

done

執(zhí)行機(jī)制:

依次將列表中的元素賦值給:變量名”每次賦值后即執(zhí)行一次循環(huán)體;直到列表中的元素耗盡,循環(huán)結(jié)束

列表的生成方式

(1)直接給出列表

(2)整數(shù)列表:

? ? ? ? (a) {start..end}

? ? ? ? (b) $(seq [start[step]] end)

(3)返回列表的命令

$(COMMAND)

(4)使用glob,如:*.sh

(5)變量引用;

$@,$*

針對(duì)for循環(huán)下的練習(xí)題

1,判斷/var/目錄下所有文件的類(lèi)型


腳本示例


執(zhí)行效果

2,添加10個(gè)用戶(hù)user1-user10,密碼為8位隨機(jī)字符


腳本示例


執(zhí)行結(jié)果

3。/etc/rc.d/rc3.d目錄下分別有多個(gè)以K開(kāi)頭和以S開(kāi)頭的文件;分別讀取每個(gè)文件, 以K開(kāi)頭的輸出為文件加stop,以S開(kāi)頭的輸出為文件名加start,如K34filename stop S66filename start


利用ls命令顯示下圖所有列表,再用bash的字符串測(cè)試是否存在后面追加輸入內(nèi)容


實(shí)現(xiàn)效果

4、編寫(xiě)腳本,提示輸入正整數(shù)n的值,計(jì)算1+2+…+n的總和


利用bash測(cè)試是否為正整數(shù)


執(zhí)行效果

5、計(jì)算100以?xún)?nèi)所有能被3整除的整數(shù)之和



執(zhí)行效果圖

6,打印九九乘法表。



7,在/testdir目錄下創(chuàng)建10個(gè)html文件,文件名格式為數(shù)字N(從1到10)加隨機(jī)8個(gè)字 母,如:1AbCdeFgH.html


四:while循環(huán)

while CONDITION;do

? ? ? ? ? ? ? ? ? ?循環(huán)體

done

CONDITION:循環(huán)控制條件;進(jìn)入循環(huán)之前,先在一次判斷;每一次循環(huán)之后會(huì)再次做判斷;條件為“true”,則執(zhí)行一次循環(huán);直到條件測(cè)試狀態(tài)為“false"終止循環(huán)

因此;CONDTION一般應(yīng)該又循環(huán)控制變量而此變量的值會(huì)在循環(huán)體不斷地被修正

進(jìn)入條件:CONDITION為true

退出條件:CONDITION為false

針對(duì)以上條件所做的練習(xí)題

1,編寫(xiě)腳本,求100以?xún)?nèi)所有正奇數(shù)之和



執(zhí)行結(jié)果


2、編寫(xiě)腳本,打印九九乘法表


腳本示例


實(shí)現(xiàn)效果

3、編寫(xiě)腳本,實(shí)現(xiàn)打印國(guó)際象棋棋盤(pán)


腳本示例


執(zhí)行效果

4、編寫(xiě)腳本,利用變量RANDOM生成10個(gè)隨機(jī)數(shù)字,輸出這個(gè)10數(shù)字,并顯 示其中的最大值和最小值


腳本示范


執(zhí)行結(jié)果

五,until循環(huán) ? (與while循環(huán)條件相反,很少用)

語(yǔ)法:until CONDITON ;do

? ? ? ? ? ? 循環(huán)體

done

進(jìn)入條件:CONDITION為false

退出條件:CONDITION為true

練習(xí)until:

每隔3秒鐘到系統(tǒng)上獲取已經(jīng)登錄的用戶(hù)的信息;如果發(fā) 現(xiàn)用戶(hù)liyi登錄,則將登錄時(shí)間和主機(jī)記錄于日志 /data/login.log中,并退出腳本


腳本示范


執(zhí)行效果

六,循環(huán)控制語(yǔ)句continue

在循環(huán)任務(wù)中,如果遇到continue就跳過(guò)本次循環(huán),執(zhí)行下一次循環(huán)

continue 后面加參數(shù)continue [N] 指定結(jié)束第N層的本輪循環(huán),而直接進(jìn)入下一輪判斷;最內(nèi)層為 第1層

示例:

while CONDTIITON1; do

?????CMD1

?????...?

?????if CONDITION2; then?

?????continue ? ? ? ? ? ? ? ? ? ? ?#如果滿(mǎn)足第二個(gè)條件執(zhí)行continue命令


?????fi?

?????????CMDn ? ? ? ? ? ? ? ? ? ?#跳過(guò)接下來(lái)要執(zhí)行的任務(wù)而不是退出循環(huán)

?????...?

?????done

七,循環(huán)控制語(yǔ)句break

在循環(huán)體中遇見(jiàn)break則結(jié)束整個(gè)任務(wù)。

break后面加參數(shù) bark[N]指定提前結(jié)束第N層循環(huán),最內(nèi)層為第一層

示例:

while CONDTIITON1;do

? ? CMD1

? ? ....

if CONDITION2;THEN

? ? ? ? break ? ? ? #如果條件2滿(mǎn)足條件,執(zhí)行break結(jié)束整個(gè)循環(huán)

fi

CMDn

....

done


八,循環(huán)控制shift命令

shift [n]?

用于將參量列表 list 左移指定次數(shù),缺省為左移一次。?

參量列表 list 一旦被移動(dòng),最左端的那個(gè)參數(shù)就從列表中刪除。

while 循環(huán)遍 歷位置參量列表時(shí),常用到 shift


練習(xí)shift

腳本示例
執(zhí)行效果


九,特殊用法

while循環(huán)的特殊用法(遍歷文件的每一行):

語(yǔ)法:

while read line; do

????????循環(huán)體

done < /PATH/FROM/SOMEFILE

依次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將行賦值給變量line


雙小括號(hào)寫(xiě)法:即((…))格式,也可以用于算術(shù)運(yùn)算

雙小括號(hào)方法也可以使bash Shell實(shí)現(xiàn)C語(yǔ)言風(fēng)格的變量操作

? ??I=10?

? ??((I++))

for循環(huán)的特殊格式:

for ((控制變量初始化;條件判斷表達(dá)式;控制變量的修正表達(dá)式))

do

? ??????????循環(huán)體?? ??

done

控制變量初始化:僅在運(yùn)行到循環(huán)代碼段時(shí)執(zhí)行一次

控制變量的修正表達(dá)式:每輪循環(huán)結(jié)束會(huì)先進(jìn)行控制變量修正運(yùn)算,而后再做 條件判斷


十,select循環(huán)與菜單

語(yǔ)法:

select variable in list

? ? do

循環(huán)體命令

done

select 循環(huán)主要用于創(chuàng)建菜單,按數(shù)字順序排列的菜單項(xiàng)將顯示在 標(biāo)準(zhǔn)錯(cuò)誤上,并顯示 PS3 提示符,等待用戶(hù)輸入

用戶(hù)輸入菜單列表中的某個(gè)數(shù)字,執(zhí)行相應(yīng)的命令

用戶(hù)輸入被保存在內(nèi)置變量 REPLY 中


slect 與case

select 循環(huán)主要用于創(chuàng)建菜單,按數(shù)字順序排列的,它是個(gè)無(wú)限循環(huán),因此要記住用 break 命令退 出循環(huán),或用 exit 命令終止腳本。也可以按 ctrl+c 退出循環(huán)

select 經(jīng)常和 case 聯(lián)合使用

舉例:創(chuàng)建菜單和退出菜單


腳本示范


腳本執(zhí)行效果

十一,信號(hào)補(bǔ)捉

trap '觸發(fā)指令' 信號(hào)

自定義進(jìn)程收到系統(tǒng)發(fā)出的指定信號(hào)后,將執(zhí)行觸發(fā)指令,而不會(huì)執(zhí)行原操作

trap '' 信號(hào) ?:忽略信號(hào)的操作

trap '-' 信號(hào) :恢復(fù)原信號(hào)的操作

trap -p ? :列出自定義信號(hào)操作

示例:

打印數(shù)字捕捉信號(hào)



完結(jié)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容