一、for循環語句
? ? ? ? 當面對各種列表重復任務時,使用簡單的if語句已經難以滿足需求,這時就需要for循環語句。for語句的結構為:
for 變量 in 取值列表
do
? ? ? ? 命令序列
done
使用for循環語句時,需要指定一個變量及取值列表,針對不同的取值重復執行相同的命令序列,直到列表中的變量用完之后,退出循環。
? ? ? ? for循環的執行流程為:
?
? ? ? ? ?for循環的應用實例:根據IP地址檢查主機狀態。
?得出結果為:
二、使用while循環語句
? ? ? ? for循環語句適用于列表對象無規律,且列表來源已固定的場合。而對于按照特定條件執行重復操作的情況,則while更適合。
? ? ? ? 在腳本應用中,while可以根據特定的條件反復執行一個命令序列,直到該條件不再滿足為止。使用while時也應該注意,不要出現死循環的情況,死循環會導致while中的命令序列會一直重復執行,后邊的命令操作將無法執行,因此,應在while內部寫入修改測試條件的語句,以便在適當的時候跳出循環。
? ? ? ? while的語法結構:
while 條件測試操作
do
? ? ? ? 命令序列
done
? ? ? ? while執行的流程為:
? ? ? ? while循環實例:猜價格游戲
????????
三、until循環語句
????????until循環與while循環類似,while循環能實現的腳本unti同樣也可以實現,但區別是while循環在條件為真是繼續執行循環,而unti則是在條件為假時執行循環。until的語法結構和while相似,流程也一樣唯一不同的while是條件為真時才會循環,until是條件為假時才會循環。
? ? ? ? until循環實例:計算1~50的和
????????
四、shell函數
? ? ? ? Shell函數可用于存放一系列的指令。在Shell腳本執行過程中,函數被之于內存中,每次調用函數時不需要從內存讀取,因此運行的速度比較快。通過編寫、使用函數,可以提高程序可讀性與重用性,避免編寫大量重復代碼。
? ? ? ? Shell函數定義的方法如下:
[function] 函數名() {
? ? ? ? 命令序列
? ? ? ? [return x]
}
- “function”關鍵字表示定義一個函數,可以省略;
- {"符號表示函數執行命令的入口,該符號可以與函數名同行也可以在函數名下一行的句首;
- }”符號表示函數體結束,兩個大括號之間{}是函數體;
- “命令序列”部分可以是任意的 Shel 命令,也可以調用其他函數;
- “return”表示退出函數返回一個退出值,通過返回值判斷執行是否成功,也可以使用 exit 終止整個 Shell 腳本。
? ? ? ? Shell函數的調用的方法為:函數名 [參數1] [參數2]...。
4.2 函數變量的作用范圍
? ? ? ? 函數變量的作用范圍分為:
- 局部:局部變量只在函數內部有效,在函數外部不能調用。通常在函數名前加一個"local"關鍵字來聲明局部變量,且只能在聲明的函數內部使用。
- 全局:在整個腳本中都能夠使用,注意聲明時不要與局部變量沖突。
4.3?函數的參數
? ? ? ? 函數參數的用法如下:
函數名稱? 參數1 參數2 參數3......
在使用函數內部使用函數參數時,要使用"$n"這中形似使用,n是第n個參數。而從第10個參數開始,調用時要用"${n}"的方式。
4.4 遞歸函數
? ? ? ? 遞歸函數就是指函數自己調用自己。例如:
myFunction() {
? ? ? ? if [ $1 -gt?0 ]
? ? ? ? then
? ? ? ? ? ? ? ? local num=$1
? ? ? ? ? ? ? ? let "num=$num-1"
? ? ? ? ? ? ? ? myFunction $num #這里遞歸地調用了自己
? ? ? ? fi
}
myFunction 5
五、 Shell數組
????????在Shell腳本中,數組是一種常見的數據結構,主要的應用場景包括:獲取數組長度、獲取元素長度、遍歷元素、元素切片、元素替換、元素刪除等等。Shell 中的數組與Java、C、Python不同,只有一維數組,沒有二維數組。數組元素的大小與限制,也不需要事先定義。Shell 數組用括號()來表示,元素用空格分隔,元素的下標與大部分編程語言類似從0開始。
? ? ? ? 數組常用定義方法包括以下幾種:
- 數組名=(value0 value1 value2......)
- 數組名=([0]=value [1]=value [2]=value......)
- 列表名=“value0 value1 value2......”? ? ? ? ? ?數組名=($列表名)
- 數組名[0]=“value”
? ? ? ? 數組名[1]=“value”
? ? ? ? 數組名[2]=“value”...
? ? ? ? 下面通過具體的示例了解數組的基本使用方法:
? ? ? ? 1. 獲取數組長度
arr_number=(1 2 3 4 5)
arr_length=$(#arr_number[*])
echo $arr_number
5 #輸出5
? ? ? ? 2. 讀取某下表賦值
arr_index2=${arr_number[2]}? #第三個元素
echo $arr_index2
2 #輸出2
? ? ? ? 3. 數組遍歷
? ? ? ? 4. 數組切片
arr=(1 2 3 4 5)
echo ${arr[@]} #輸出整個數組
1 2 3 4 5 #輸出
echo ${arr[@]:0:2}? #${數組名[@或*]:起始位置:長度}
1 2 #輸出
echo ${arr[@]:2:3}
3 4 5
? ? ? ? 5. 數組替換
arr=(1 2 3 4 5)
echo ${arr[@]/4/66}? #${數組名[@或*]/查找字符/替換字符}
1 2 3 66 5
echo ${arr[@]}? #并不會替換數組原有內容
arr=(${arr[@]/4/66})? #要實現改變原有數組,開通過重新賦值來實現
echo ${arr[@]}
1 2 3 66 5
? ? ? ? 6. 數組刪除
arr=(1 2 3 4 5)
unset arr? #刪除數組
echo ${arr[*]}
arr=(1 2 3 4 5)
unset arr[2]? ?#刪除第三個元素
echo ${arr[*]}
1 2 4 5
六、腳本調試
????????為避免編寫的腳本出錯,除了在編寫腳本時注意書寫規范,排除語法錯誤,更重要的是利用調試腳本工具來調試腳本。echo命令是最有用的調試腳本工具之一,一般在可能出現問題的腳本中加入echo命令,采用的是分段排查的方式。除了echo命令之外,bash Shell也有相應參數可以調試腳本。使用bash命令參數調試,命令的語法為:
sh [-nvx] 腳本名
其中參數的含義為:
- -n:不會執行該腳本,僅查詢腳本語法是否有問題,如果沒有語法問題就不顯示任何內容,如果有問題會提示報錯。
- -v:在執行腳本時,先將腳本的內容輸出到屏幕上然后執行腳本,如果有錯誤,也給出錯誤提示。
- -x:將執行的腳本內容輸出到屏幕上,這個是對調試很有用的參數。
當腳本過長時,可以通過"set"命令,只調試部分腳本。通過在要調試腳本的上一行寫上"set -x",在腳本末行的下一行寫上"set -x"即可調試中間的腳本。