[toc]編程
重複執行一系列命令在 編程中很常見。一般你須要重複一組命令直到達到某個特定條件,好比處理某個目錄下的全部文件、系統上的全部用戶或者是某個文本文件中的全部行。vim
常見的兩種循環,在腳本中廣泛被用到。bash
for循環
while循環ide
語法:for 變量名 in 條件; do …; donecode
for var in list do commands done 在list參數中,提供了迭代中要用的一系列值
思路:input
[root@xavi ~]# !vim vim sum01.sh #!/bin/bash sum=0 for i in `seq 1 100` do sum=$[ $sum+$i ] echo $i done echo $sum
#!/bin/bash cd /etc/ //腳本中若是查詢的目錄在多級目錄下,首先要進入到目錄,或者,直接跟絕對路徑 for a in `ls /etc/` //遍歷/etc目錄 do if [ -d $a ] //一個一個的去判斷是否爲目錄 then ls -d $a //若是是目錄,就查看下目錄內的文件+子目錄 fi done
[root@xavi ~]# !vim vim for02.sh #!/bin/bash cd /etc/ for a in `ls /etc/` do [ -d $a ] && ls $a # 判斷是不是目錄,並列出其下文件和子目錄 if [ -d $a ] then echo $a ls $a fi done ~
特殊for循環示例:list循環時,會以空格或回車符做爲分隔符了it
[root@xavi ~]# mkdir xavi [root@xavi ~]# cd xavi/ [root@xavi xavi]# ls [root@xavi xavi]# touch 1 2 [root@xavi xavi]# touch 3\ 4.txt [root@xavi xavi]# ls 1 2 3 4.txt [root@xavi xavi]# for i in `ls ./`; do echo $i ; done 1 2 3 4.txt //把3 4.txt一個文件拆分紅兩個了
語法:for循環
while test command do other commands done
#!/bin/bash while : //:爲死循環的意思,也至關於ture, do load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1` if [ $load -gt 10 ] then top|mail -s "load is high: $load" asd123@126.com fi sleep 30 // 負載有時候不可能一秒鐘就起來了,因此每隔30秒判斷一次便可。咱們使用sleep 去暫停30秒鐘。而後再次執行。。。 done
把用戶輸入的數字輸出.class
#!/bin/bash while : do read -p "Please input a number: " n if [ -z "$n" ] then echo "you need input sth." continue fi n1=`echo $n|sed 's/[0-9]//g'` if [ -n "$n1" ] // -n = ! -z ,記得加雙引號 then echo "you just only input numbers." continue fi break done echo $n
[ ] continue: 當用戶沒有輸入的時候,首先提示,而後繼續讓用戶輸入。直到輸入是一個真正的數字,跳出if語句。test
示例:
#! /bin/bash for i in `seq 1 5` do echo $i if [ $i == 3 ] then break fi echo $i done echo aaa
執行步驟以下:
[root@xavi xavi]# sh -x break.sh ++ seq 1 5 + for i in '`seq 1 5`' + echo 1 1 + '[' 1 == 3 ']' + echo 1 1 + for i in '`seq 1 5`' + echo 2 2 + '[' 2 == 3 ']' + echo 2 2 + for i in '`seq 1 5`' + echo 3 3 + '[' 3 == 3 ']' + break + echo aaaa aaaa
也就是說,一旦遇到break就會跳出當前循環,進行下一步。
忽略continue之下的代碼,直接進行下一次循環。
#! /bin/bash for i in `seq 1 5` do echo $i if [ $i == 3 ] then continue fi echo $i done echo aaa
執行結果以下:
1 1 2 2 3 4 4 5 5 aaa
也就是說,當執行到continue的時候,下面任何語句直接忽略。。直接進行了下一次for循環。
#! /bin/bash for i in `seq 1 5` do echo $i if [ $i == 3 ] then exit fi echo $i done echo aaa
執行步驟以下:
++ seq 1 5 + for i in '`seq 1 5`' + echo 1 1 + '[' 1 == 3 ']' + echo 1 1 + for i in '`seq 1 5`' + echo 2 2 + '[' 2 == 3 ']' + echo 2 2 + for i in '`seq 1 5`' + echo 3 3 + '[' 3 == 3 ']' + exit