一、for循環語法: for 變量名 in 條件;do......;doneshell
1:案例1:求1加到100的和:vim
[root@localhost_02 for]# vim for1.sh #!/bin/bash sum=0 for i in `seq 1 100` do sum=$[$sum+$i] echo $i done echo $sum
註釋:首先須要給sum賦一個變量值0,進入for循環後,每循環一次,sum的值向上加一次就變化一次,一直到$i,最後輸出結果$sum:bash
註釋:加減法的固定格式: sum=$sum[$sum+$i]code
2:案例2:for循環文件列表,列出/etc/目錄下的子目錄:字符串
[root@localhost_02 for]# cat for2.sh #!/bin/bash cd /etc/ for i in `ls /etc/` do if [ -d $i ] then echo $a ls -ld $i fi done
[root@localhost_02 for]# for i in `seq 1 3`;do echo $i;done 1 2 3 [root@localhost_02 for]# for i in 1 2 3;do echo $i;done 1 2 3
註釋:for循環會以回車或者空格做爲分隔符:以下:input
[root@localhost_02 test]# touch 1 2 [root@localhost_02 test]# touch 3\ 4.txt [root@localhost_02 test]# ls -la -rw-r--r-- 1 root root 0 9月 26 16:45 1 -rw-r--r-- 1 root root 0 9月 26 16:45 2 -rw-r--r-- 1 root root 0 9月 26 16:45 3 4.txt [root@localhost_02 test]# for i in `ls ./`;do echo $i;done 1 2 3 4.txt
二、while循環語法:while 條件;do .......;doneit
案例1:寫一個監控負載的腳本:for循環
[root@localhost_02 shell]# cat while.sh #!/bin/bash while : #冒號表示循環,此處能夠用1或者true均可以; do load=`uptime|awk -F 'load average: ' '{print $2}'|cut -d . -f1` if [ $load -ge 10 ] then /usr/local/sbin/mail.py xxx@163.com "load high" "$load" fi sleep 30 #休眠30秒後,繼續檢測系統的負載; done [root@localhost_02 shell]# sh -x while.sh + : ++ awk -F 'load average: ' '{print $2}' ++ cut -d . -f1 ++ uptime + load=0 + '[' 0 -ge 10 ']' + sleep 30 若想這種腳本不意外的終止,能夠打開screen,在screen跑腳本;
註釋:class
uptime表示查看awk系統的負載,(能夠用w,不過須要結合head -1使用):test
awk -F 'load average: ' '{print $2} 表示以load average爲分隔符,並打印第二端:
cut -d . -f1 表示用cut命令以 . 點做爲分隔符,取第一個字符:
while循環案例2:輸入一個數字,若是不是數字,則一直輸入,輸入是數字後則正常顯示:
[root@localhost_02 shell]# cat while1.sh #!/bin/bash while : do read -p "Please input number: " n if [ -z "$n" ] then echo "you need input sth" continue fi n1=`echo $n|sed s/[0-9]//g` if [ -n "$n1" ] then echo "you just only input numbers" continue fi break done echo $n [root@localhost_02 shell]# sh while1.sh Please input number: you need input sth Please input number: you need input sth Please input number: sdfs you just only input numbers Please input number: 2 2
註釋:contiune 繼續循環:
break:用於循環語句,直接結束全部循環:當數字等於3時,則結束全部循環:
註釋:以下圖例表示結束了if和for循環,而後繼續打印echo內容:
[root@localhost_02 shell]# cat break.sh #!/bin/bash for i in `seq 1 5` do echo $i if [ $i -eq 3 ] #比較數字,用-eq ;如果比較的是字符串,那須要用 == then break fi echo $i done echo aaaaa 檢測: [root@localhost_02 shell]# sh -x break.sh ++ seq 1 5 + for i in '`seq 1 5`' + echo 1 1 + '[' 1 -eq 3 ']' + echo 1 1 + for i in '`seq 1 5`' + echo 2 2 + '[' 2 -eq 3 ']' + echo 2 2 + for i in '`seq 1 5`' + echo 3 3 + '[' 3 -eq 3 ']' + break + echo aaaaa aaaaa [root@localhost_02 shell]# sh break.sh 1 1 2 2 3 aaaaa [root@localhost_02 shell]#
continue:結束本次循環,忽略continue下面的代碼,直接進行下一次循環:
註釋:以下圖例表示忽略了本次continue下的代碼(條件是等於3),其他代碼正常運行:
[root@localhost_02 shell]# cat con.sh #!/bin/bash for i in `seq 1 5` do echo $i if [ $i -eq 3 ] then continue fi echo $i done echo bbbbb [root@localhost_02 shell]# sh con.sh 1 1 2 2 3 4 4 5 5 bbbbb
exit:退出整個腳本,用來肯定腳本運行到什麼位置時結束:
註釋:以下圖例表示直接退出整個腳本了:
[root@localhost_02 shell]# cat exit.sh #!/bin/bash for i in `seq 1 5` do echo $i if [ $i -eq 3 ] then exit fi echo $i done echo $ccccc [root@localhost_02 shell]# sh exit.sh 1 1 2 2 3