shell腳本循環嵌套


嵌套循環

在循環語句內使用任意類型的命令,包括其他循環命令,叫做嵌套循環。因為是在迭代中迭代,需要注意變量的使用以及程序的效率問題。

下面舉一個for循環嵌套for循環的例子:

wangsx@SC-201708020022:~/tmp$ cat test14 #!/bin/bash # nesting for loops for (( a = 1; a <= 3; a++ )) do echo "Starting loop $a:" for (( b = 1; b <= 3; b++ )) do echo " Inside loop: $b" done done wangsx@SC-201708020022:~/tmp$ . test14 Starting loop 1: Inside loop: 1 Inside loop: 2 Inside loop: 3 Starting loop 2: Inside loop: 1 Inside loop: 2 Inside loop: 3 Starting loop 3: Inside loop: 1 Inside loop: 2 Inside loop: 3 

shell能夠自動識別匹配的dodone字符。這種模式很常見,比如通常的小括號(())、中括號、花括號匹配等等。它們的本質都是字符匹配。

在混用循環命令時也一樣,比如在while循環中內嵌一個for循環:

wangsx@SC-201708020022:~/tmp$ cat test15 #!/bin/bash # placing a for loop inside a while loop var1=5 while [ $var1 -ge 0 ] do echo "Outer loop: $var1" for (( var2 = 1; $var2 < 3; var2++)) do var3=$[ $var1 * $var2 ] echo " Inner loop: $var1 * $var2 = $var3" done var1=$[ $var1 - 1 ] done wangsx@SC-201708020022:~/tmp$ . test15 Outer loop: 5 Inner loop: 5 * 1 = 5 Inner loop: 5 * 2 = 10 Outer loop: 4 Inner loop: 4 * 1 = 4 Inner loop: 4 * 2 = 8 Outer loop: 3 Inner loop: 3 * 1 = 3 Inner loop: 3 * 2 = 6 Outer loop: 2 Inner loop: 2 * 1 = 2 Inner loop: 2 * 2 = 4 Outer loop: 1 Inner loop: 1 * 1 = 1 Inner loop: 1 * 2 = 2 Outer loop: 0 Inner loop: 0 * 1 = 0 Inner loop: 0 * 2 = 0 

如果想要挑戰腦力,可以混用untilwhile循環。

wangsx@SC-201708020022:~/tmp$ cat test16 #!/bin/bash # using until and while loop var1=3 until [ $var1 -eq 0 ] do echo "Outer loop: $var1" var2=1 while [ $var2 -lt 5 ] do var3=$(echo "scale=4; $var1 / $var2" | bc) echo " Inner loop: $var1 / $var2 = $var3" var2=$[ $var2 + 1 ] done var1=$[ $var1 - 1 ] done wangsx@SC-201708020022:~/tmp$ . test16 Outer loop: 3 Inner loop: 3 / 1 = 3.0000 Inner loop: 3 / 2 = 1.5000 Inner loop: 3 / 3 = 1.0000 Inner loop: 3 / 4 = .7500 Outer loop: 2 Inner loop: 2 / 1 = 2.0000 Inner loop: 2 / 2 = 1.0000 Inner loop: 2 / 3 = .6666 Inner loop: 2 / 4 = .5000 Outer loop: 1 Inner loop: 1 / 1 = 1.0000 Inner loop: 1 / 2 = .5000 Inner loop: 1 / 3 = .3333 Inner loop: 1 / 4 = .2500 

外部的until循環以值3開始,並繼續執行到值等於0。內部while循環以值1開始一直執行,只要值小於5。需要注意循環條件的設置,我跑的幾次都沒寫完整,然后無限循環只好重開終端。

控制循環

之前的學的命令已經可以讓我們寫循環程序了,設定好以后等待命令開始執行和等待循環結束。但是很多情況下,在循環中我們設定的某個(多個)變量達到某種條件時,我們就想要停止循環,然后運行循環下面的命令。這時候我們需要用到breakcontinue命令來幫我們控制住循環。

這兩個命令在其他語言中基本都時關鍵字,特別是C,用法差不多。我也就不具體介紹了,只點出它們的功能。

break

在shell執行break命令時,它會嘗試跳出當前正在執行的循環。

在處理多個循環時,break命令會自動終止你所在的最內層循環。

break命令接受單個命令行參數值:

​ break n

​ 其中n制訂了要跳出的循環層級(層數)

continue

continue命令可以提前終止某次循環的命令,但並不會完全終止整個循環。可以在循環內部設置shell不執行命令的條件。

也就是說使用continue命令時,它會自動跳過本次循環中接下來的運行步驟,跳轉到下一次循環。但注意不是跳出,跳出時break的功能。

同樣的可以使用continue n n制定要繼續執行哪一級循環

處理循環的輸出

在shell腳本中,我們可以對循環的輸出使用管道或進行重定向。這是通過在done命令之后添加一個處理命令來實現的。

wangsx@SC-201708020022:~/tmp$ cat test #!/bin/bash for file in /home/* do if [ -d "$file" ] then echo "$file is a directory" else echo "$file is a file" fi done > output.txt wangsx@SC-201708020022:~/tmp$ cat output.txt /home/wangsx is a directory 

shell將for命令的結果重定向到文件output.txt中,而不是顯示在屏幕上。

實例

下面兩個例子演示如何用簡單循環來處理數據。

查找可執行文件

Linux運行程序時通過環境變量$PATH提供的目錄搜索可執行文件。如果徒手找的話,比較費時間,我們可以寫個腳本來搞定它。

wangsx@SC-201708020022:~$ cat test25 #!/bin/bash # finding files in the PATH IFS=: for folder in $PATH do echo "$folder:" for file in $folder/* do if [ -x $file ] then echo " $file" fi done done  # 輸出結果太多,我就不拷貝結果了 

先設定IFS分隔符以便於能正確分隔目錄,然后將目錄存放在$folder中,用for循環來迭代特定的目錄中所有文件,然后用if-then命令檢查文件的可執行權限。

Linux有一個tree工具,非常方便輸出目錄結構,推薦使用下。

創建多個用戶賬號

如果你是管理員,需要創建大量賬號時。不必每次都有useradd命令添加用戶。將用戶信息存放在指定文件,然后用腳本進行處理就可以了。

用戶信息的格式如下:

userid, user name

第一個是你為用戶選擇的id,第二個是用戶的全名。這是csv文件格式。

為了能夠讀取它,我們使用以下命令:

while IFS=',' read -r userid name

read命令會自動獲取.csv文本文件的下一行內容,所以不用再寫一個循環來處理。當read命令返回FALSE時(也就是讀完了),while命令就會退出。

為了把數據從文件導向while命令,只要再while命令尾部加一個重定向符號。

處理過程寫成腳本如下:

#!/bin/bash # process new user accounts input="users.csv" while IFS=',', read -r userid name do echo "adding $userid" useradd -c "$name" -m $userid done < "$input"


作者:王詩翔
鏈接:https://www.jianshu.com/p/8b09c76f5f75
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM