bash之流程控制for循环及bash命令退出和退出状态码
一、for循環定義:
????????將一段代碼反復執行;----->進入條件;------> 退出條件;
二、語法格式:
for 變量名 in LIST
do?
statement1
...
done
for VAR in LIST; do statement1; statement2; ...; done
三、LIST:列表
定義:包含至少一個元素的字符串集合;
LIST的生成方法:
(1) 直接給出;
(2) 數值列表:
(a) {start..end},例如:{1..10}
(b) seq [start [step]] end
(3) 返回列表的命令;
(4) globbing;
(5) 變量引用;
$*, $@
例如:添加3個用戶,user1, user2, user3; 密碼同用戶名;
#?vim?user.sh #!/bin/bash # for?username?in?user1?user2?user3?;?douseradd?$usernameecho?$username?|passwd?--stdin?$username done #?bash?-n?user.sh? #?bash?-x?user.sh例如:添加9個用戶,user101...user109;密碼同用戶名;
四、for循環練習題:
練習1:于/tmp/test目錄中創建10個空文件f1,.., f10;
#!/bin/bash # for?n?in?{1..10};?domkdir?/tmp/test/file$n?&>/dev/null done練習2:寫一個腳本,
(1) 創建"/tmp/test-當前時間"目錄;
(2) 添加10用戶tuser1,.., tuser10;?
(3) 在"/tmp/test-當前時間"目錄中,創建10空文件f1,...,f10;
(4) 修改f1的屬主為tuser1;依次類推;
#!/bin/bash # directory=/tmp/test-`date?+%H-%N-%S` mkdir?$directory for?i?in?{1..10};do? useradd?tuser$i touch?$directory/f$i chown?tuser$i?$directory/f$i done練習3:求100以內所有正整數之和;
練習4:求100以內所有偶數之和;以及所有奇數之和;
#!/bin/bash # ODD_SUM=0 # EVEN_SUM=0 # ODD_LIST=$(seq?1?2?100) EVEN_LIST=$(seq?0?2?100) # for?n?in?$ODD_LIST;?doODD_SUM=$[$ODD_SUM+$n] done # echo?"一到一百的奇數和為:$ODD_SUM" # for?m?in?$EVEN_LIST;?doEVEN_SUM=$[$EVEN_SUM+$m] done # echo?"一到一百的偶數和為:$EVEN_SUM"練習5:計算當前系統上所有用戶ID之和;
#!/bin/bash # UID_SUM=0 UID_LIST=$(cut?-d':'?-f3?/etc/passwd) # for?n?in?$UID_LIST;?doUID_SUM=$[$UID_SUM+$n] done echo?"The?all?user?ID?sum?is?'$UID_SUM'"練習6:傳遞參數(文本文件路徑)給腳本,統計所有文件的空白行數之和;顯示此次共對多少文件進行統計;
#!/bin/bash # File_Sum=$# echo?"the?sum?of?file?is?$File_Sum" for?i?in?$*;?doSpace_Sum=$(grep?'^[[:space:]]*$'?$i?|?wc?-l)SPACE_ALL=$[$SPACE_ALL+$Space_Sum] done echo?"the?sum?of?space?is?$SPACE_ALL" #??$*可以直接生成文件列表練習7:顯示當前系統所有默認shell為bash的用戶的總數;并統計此些用戶ID之和;
#!/bin/bash # BASH_SUM=0 BASH_SUM=$(grep?'bash$'?/etc/passwd?|?wc?-l) echo?"the?sum?of?bash?is?$BASH_SUM" UID_SUM=0 UID_LIST=$(grep?'bash$'?/etc/passwd?|?cut?-d':'?-f3) for?n?in?$UID_LIST;?doUID_SUM=$[$UID_SUM+$n] done echo?"the?sum?of?BID?is?$UID_SUM" grep?'bash$'?/etc/passwd?|?cut?-d':'?-f3練習8:寫一個腳本
(1) 假設某目錄下分別有K##和S##開頭文件若干;(/etc/rc.d/rc3.d/為例;)
(2) 給此目錄下的所有以K開頭的文件,傳遞一個stop參數;(echo "/etc/rc.d/rc3.d/atd stop")
(3) 給此目錄下的所有以S開頭的文件,傳遞一個start參數;
#!/bin/bash for?file?in?/etc/rc.d/rc3.d/K*;?doecho?'$file?stop'? another?way:?echo?-e?"$file?stop...........[\033[34mOK\033[0m]"?則后面會顯示藍色OK done for?file?in?/etc/rc.d/rc3.d/S*;?doecho?'$file?start' done練習9:寫一個腳本
(1) 使用Ping命令探測172.16.100.X主機的在線狀態;
#!/bin/bashfor?host?in?{1..254};?doping?-c1?-w1?172.16.100.$host done練習10:寫一個腳本
(1) 給一個腳本傳遞一些用戶名;
(2) 計算此些用戶所屬基本組的id之和;
#!/bin/bashdeclare?-i?GSUM=0 for?username?in?$1;?doGSUM=$[$GSUM+`id?-g?$username`] done echo?the?GID_SUM?is?$GSUM五、for的幾種特殊情況:
(1) for省略,會自動獲取腳本參數列表;
(2) C編程風格:
for ((變量賦值;循環條件;修正表達式)); do
CMD1
CMD2
done
例如:求100以內偶數之和
#!/bin/bash declare?-i?evensum=0 for?((i=2;i<=100;i+=2));do let?evensum+=$i done echo?$evensum(3) 循環嵌套:
for i in [LIST1]; do
CMD1
for j in [LIST2]; do
CMD2
...
done
done
練習11:寫一個腳本
(1) ping 172.16.X.Y內的所有主機;
172.16.0-255.1-254
#!/bin/bash for?i?in?{0..255};?dofor?j?in?{1..254};?doping?-c1?-w1?172.16.$i.$jdone done練習12:寫個腳本
(1) 傳遞一些目錄給腳本;
(2) 逐個顯示每個目錄下的所有一級文件的內容類型;
(3) 統計一個有多少個目錄;一共顯示了多少個文件;
#!/bin/bash # declare?-i?dirs=0 declare?-i?files=0 for?d?in?$*;?dofor?f?in?$d/*;?dofile?$flet?files++donelet?dirs++ done echo?"Directories:?$dirs." echo?"Files:?$files."解析:let?dirs++?為計數器,就是循環多少次,計數為多少;等價于dir=[$dirs+1]六、bash命令退出和退出狀態碼
命令在bash中執行結束退出時,其執行成功與否可通過退出狀態碼來記錄;
腳本的退出狀態碼取決于執行的最后一條命令;自定義退出狀態碼:
exit #
成功:0
失敗:1-255
注意:提前退出腳本,也可使用exit命令實現;
例如:以某條命令的狀態作為腳本的退出狀態碼
#!/bin/bash # ls?/varr retval=$? echo?"hello" exit?$retval 解析:retval為此條命令的輸出狀態碼轉載于:https://blog.51cto.com/burgess8909/1673133
總結
以上是生活随笔為你收集整理的bash之流程控制for循环及bash命令退出和退出状态码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现mysql按月统计的教程
- 下一篇: 架构师速成7.2-为什么要学习协议、规范