shell高級編程--循環判斷

前言
※1.1 爲什麼要學習shell編程
Shell腳本語言是實現Linux/UNIX系統管理及自動化運維所必備的重要工具,Linux/UNIX系統的底層及基礎應用軟件的核心大都涉及Shell腳本的內容。每一個合格的Linux系統管理員或運維工程師,都需要能夠熟練地編寫Shell腳本語言,並能夠約定系統及各類軟件附帶的Shell腳本內容。只有這樣才能提升運維人員的工作效率,適應日益複雜的工作環境,減少不必要的重複工作,從而爲個人的職場發展奠定較好的基礎。
1.2 學好Shell編程所需的基礎知識
學好Shell編程並通過Shell腳本輕鬆地實現自動化管理企業生產系統的必備基礎如下:
(1)能夠熟練使用vim編輯器,熟練SSH終端及”.vimrc”等的配置
(2)要有一定的Linux命令基礎,至少需要掌握80個以上Linux常用命令,並能夠熟練使用他們。
(3)要熟練掌握Linux正則表達式及三劍客命令(grep、sed、wak)
(4)熟悉常見的Linux網絡服務部署、優化、日誌分析及排除。

分支與循環

分支結構

1.1單分支結構

對於if來說,簡單來說,其語義類似於漢語裏的“如果…..那麼”
第一種語法

if < 條件表達式 >

 then
   
 指令

fi

第二種語法

if < 條件表達式 > ;then

 指令

fi

條件表達式爲真,執行指令,爲假,不執行指令。

注:上文的“條件表達式”部分可以是test、[]、[[]]、(())、甚至可以把命令直接作爲條件表達式,命令執行成功,條件表達式就true,就可以執行指令。

例1

if [ -d /etc/ ]

then

echo “/etc/ is a directory”

fi

輸出結果爲:/etc/ is a directory
[ -d /etc/ ] 是判斷/etc/是否爲目錄,顯然,根下的/etc/是目錄,所以爲真,執行echo “/etc/ is a directory “。

例2

if hostname > /dev/null ;then

 echo “it is successful”

fi

輸出結果爲:it is successful
在hostname &> /dev/null中hostname執行成功沒問題,然後把執行結果重定向/dev/null,/dev/null相當於一個黑洞,寫入裏面的內容永遠消失。我們只關心hostname這條命令是否執行成功,而不去管它的結果,因爲結果都寫入了黑洞,顯然,hostname命令執行成功,條件判斷爲真,執行指令echo “it is successful”

1.2雙分支結構

if條件語句的單分支結構主體就是“如果…..,那麼……..”,而if條件語句的雙分支結構主體則爲“如果…….那麼…….”.
if 條件語句的雙分支結構語法爲:

if <條件表達式>;then

 指令集1

else

 指令集2

fi

例3

num=10

if [[ $num -eq 10 ]];then
 
 echo “10”

else

 echo “not 10”
fi

說明:給變量num賦值10 , [[ $num -eq 10 ]] 判斷變量的值是否等於10 , 等於10 , 執行echo “10” , 不等於10 , 執行 echo ” not 10 ” .

1.3多分支結構

if 條件語句多分支結構的主體爲 “如果…… , 那麼…….. , 否則如果……..,那麼 , 那麼 , 否則如果….. , 那麼…… , 否則……” .
if條件語句多分支結構語法:

if <條件表達式1>;then

 指令1
elif <條件表達式2>;then

 指令2

elif <條件表達式3>;then
 
 指令3

else

 指令4

fi

是不是有暈呢 ? 下面舉個很貼近生活的例子 , 比如你就相當一個女孩兒

如果 <你有房>

那麼
 
 我就嫁給你

或者如果 <你爸有背景>

那麼

 我也可以嫁給你

或者如果 <你很努力吃苦>

那麼

 我們 可以先談談男女朋友

否則

 不理你

果如

例子4

if [[ -f $file ]];then

 echo “$file is ordinary file “

elif [[ -d $file ]]

 echo “$file is directory file “

elif [[ -L $file ]]

 echo “$file is link file “

else

 echo “$file is other file “

fi

說明:第一個判斷是 , 如果變量file是普通文件就執行echo “$file is ordinary file ” , 如果變量file是目錄文件就執行echo “$file is directory file ” , 如果變量是鏈接文件就執行echo “\$file is link file ” , 否則就執行echo “\$file is other file ” .

for循環

for 循環語句和while循環語句類似 , 但是for循環語句主要是用於執行次數有限的循環 , 而不是用於守護進程及無線循環 . for循環語句常見的語法有兩種 , 下面我們將一 一介紹 .
###

第一種 for 循環語句的結構如下:

for 變量名 in 變量取值列表 ; do

指令

done

for 後面有個”變量名” , 變量名依次獲取in關鍵字後面的變量取值列表內容 , 每次僅取一個 , 然後僅取一個 , 然後進入循環 do 和 done 之間的部分 , 執行循環內的所有指令 , 當執行單done時結束本次循環 . 之後 , “變量名” 再繼續獲取變量列表裏的下一個變量值 , 繼續執行循環內的所有指令 , 當執行到done時結束返回 . 以此類推 , 直到取完變量列表裏的最後一個值並進入循環執行到done結束爲止 .

例5

計算從1加100的整數

#/bin/bash

sum=0

for i in {1..100}; do

 let sum+=i

done

echo sum=$sum

腳本輸出結果:5050
說明:變量 i 依次從1到100裏面取數 , 取一次就進去循環 , sun 變量的值就加一次變量 i 取的值 , 加完之後結束一次循環 , 緊接着i 取下一個值 , 直到取到變量列表裏面的最後一個值100 , 加完循環結束 . 跳出for 循環 , 執行 echo sum= $sum , 輸出就爲5050 . 同學們可以用數學算法驗證下 , 這種計算方法出來的是否正確 , 如果數學計算這裏不再贅述 .

第二種for循環語句稱爲C語言型語句 , 其語法結構如下:

for 關鍵字後的雙口號內是三個表達式 , 第一個是變量初始化(例如:i=1) , 第二個爲變量的範圍(例如: i<100 ) , 第三個爲變量自增自減(例如: i++) . 當第一個表達式的初始化值符合第二個變量的範圍時 , 就進入循環執行 ; 當條件不滿足就退出循環 .

for (( expr1; exp2; exp3 ))

do

 指令

done

例6

for (( i=1 ; i<10 ; i++ ))

do

 echo $i

done

輸出:1 2 3 4 5 6 7 8 9
說明: 變量i 初始化的值爲1 , 變量的範圍時1到10 , 並且小於10 , 自增 , 輸出1到9的整數 .

while循環和until循環

循環語句命令常用於重複執行一條指令或一組指令 , 直到條件不再滿足時停止 , Shell腳本語言的循環語句常見的有 while util for 及 select 循環語句 .
while 循環語句主要用來重複執行一組命令或語句 , 在企業實際應用中 , 常用於守護進程或持續運行的程序 , 除此以外 , 大多數循環都會用到上文講解的for循環語句 .

while 循環語句的基本語法:

while <條件表達式>

do

 指令…..

done

上文多次解釋條件表達式和指令 , 這裏和上文的用法類似 , 下面舉例來理解while 循環語句 .

例7

同樣我們用while實現求1加到100的和

sum=0

while [[ i -le 100 ]];do

 let sum+=i

 let i++

done

echo sum=$sum

說明:條件表達式裏面規定 , 當i 小於等於100 時 , 執行let sum+=i 和 let i ++ ;當i 大於100 時 , 退出將不再執行指令 , 退出循環 . let sum+=i 表示 , sum = sum + i 每循環一次 , 執行一次 , let i++ 表示 每次i自增加1 . 循環結束 , 執行echo sum=$sum 命令 , 標準輸出 變量sum的值 .

case條件語句

case條件語句相當於多分支的if/elif/else條件語句 , 但是它比這些條件語句看起來

更規範更工整 , 常被應用與實現系統服務啓動腳本等企業應用場景中 .

在case 語句中 ,程序會將case獲取的變量的值與表達式部分的值1 值2 值3 等逐個

進行比較 , 如果獲取的變量值和某個值相匹配 , 就會執行值後面對應的指令 , 直到執

行到雙分號 ;; 才停止 , 然後再跳出case語句主體 , 執行case語句後面的其他命令 .

case 條件語句的語法:

case “變量” in

值1)

 指令……

2)

 指令…

*)

 指令…..

esac

例8

#!/bin/bash

read -p “Please choose yes or no :” choose

case $choose in

[Yy]|[Yy][Ee][Ss])

 echo “your choose is yes “

[Nn]|[Nn][Oo])

 echo “your choose is no “

*)

 echo “please input yes or no “

case

說明:read -p “Please choose yes or no :” choose 提示用戶輸入一個值 , 並賦值變量shoose .

reak continue exit 的區別和對比

break continue 在條件語句及循環語句( for while if ) 中用於控制程序的走向 ; 而exit 則用於終止所有語句並退出當前 , 除此之外 , exit 還可以返回上一次程序或命令的執行狀態值給當前shell ; return類似於exit , 只不過return 僅用於在函數內部返回函數執行的狀態值 . 關於這幾個命令的基本說明如下表:
條件與循環控制及程序返回值命令知識

命令 說明
break n 如果省略n,則跳出整個循環,n表示跳出循環的層數
continue n 如果省略n,則表示跳過本次循環,忽略本次循環的剩餘代碼,進入循環的下一次循環.n表示退到第n層繼續循環
exit n 退出當前shell城西,n爲上一次程序執行的狀態返回值.n也可以省略,在下一個shell裏可通過”$?”接受exit的n值
return n 用於在函數裏作爲函數的返回值,以判斷函數執行是否正確.在下一個shell裏可通過”$?”接受exit的n的值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章