shell 循環 for while

1 for 循環

語法: for 變量名 in 條件;do ...; done
舉例1

#!/bin/bash
sum=0
for i in `seq 1 100`;do
sum=$[$sum+$i]
done
echo $sum

舉例2
找到/123 目錄下所有後綴名為.txt的文件
批量修改.txt 為.txt.bak
分析:
可以有兩種辦法,一種是find結合xarge命令,另一種為循環。
方法一:

#!/bin/bash
find /123/ -type f -name "*.txt" |xargs -i mv{} {}.bak

方法二:

#!/bin/bash
cd /123/
for f in `ls *.txt`;do
mv $f $f.bak
done

2 while 循環

語法: while 條件;do ... ;done

#!/bin/bash
sum=0 
 i=1
    while [ $i -le 100 ]
     do
     sum=`expr $sum + $i`
     i=`expr $i + 1`
     done
echo $sum

通常我們寫一個監控腳本可以用while做一個死循環。
每隔半分鐘查看下系統負載,當負載高於10時發送郵件通知。

#!/bin/bash
while true
do
 load=`w|head -1|awk -F ‘load average: ‘ ‘{print $2}‘|cut -d ‘.‘ -f1`
 if [ $load -gt 10 ]
  then
  /usr/lib/zabbix/alertscripts/mail.py  [email protected]  "load is high"  "load is high: $load"
 fi
 sleep 30
done

備註:
w 命令用來查看系統負載,
head -1 顯示第一行,w |head -1 等價於命令uptime
awk -F ‘load average: ‘ ‘{print $2}‘ 表示以load average: 為分隔符切割,打印第二段
cut -d ‘.‘ -f1 表示以點為切割符,打印第一段
備註:我們在load average: 後面加一個空格,得到的結果前面就不會有空格。不加空格的話,還可以再接sed去掉空格
上面命令等價於w|head -1|awk -F ‘load average:‘ ‘{print $2}‘|cut -d ‘.‘ -f1 |sed ‘s/ //‘
當負載超過10時用python腳本發郵件通知,格式為腳本後面跟郵箱名,主題,內容。
對於單個字符作為分隔符,cut可以實現awk的切割打印功能,但是cut不支持字符串作為切割符。

3 循環中的continue

忽略掉本次循環的操作,直接進入下一次循環。

#!/bin/bash
for i in `seq 1 5`;do
    if [ $i -eq 3 ];then
    continue
    fi
    echo -e "$i \c"
done

運行結果為 1 2 4 5 ,continue 成功跳過了循環變量為3的操作。

4 循環中的break

碰到break語句,直接跳出當前循環。

#!/bin/bash
for i in `seq 1 5`;do
    if [ $i -eq 4 ];then
        break
    fi
    echo $i
done

運行結果為1 2 3。當循環到4時,直接跳出循環,不再執行循環中任何語句。

5 exit 語句

碰到exit語句,直接結束腳本。

#!/bin/bash
for i in `seq 1 5`;do
    if [ $i -eq 4 ];then
    exit
    fi
    echo $i
done
echo "hello world"

執行結果為1 2 3 ,我們發現最後循環外面的echo語句也沒有執行,如果把exit換成break,則會多出一句hello world

6 用while 實現的交互式重復輸入案例

需求:提示用戶輸入數字,若不輸入,則提示輸入內容,若輸入不是純數字,則提示輸入數字,直到正確輸入為止

#!/bin/bash
while [ 1 ]
do
    read -p "please input a number:" n
    if [ -z $n ];then
    echo "please input sth"
    continue
    fi
    n1=`echo $n|sed ‘s/[0-9]//g‘`
    if [ -n "$n1" ];then
    echo "please input a pure number"
    continue
    fi
    break
done
echo $n

備註:while死循環實現重復交互,第一次if判斷,當用戶未輸入字符時,則滿足-z變量值為空的條件,並給出提示,需要輸入字符。同時執行continue,循環從頭開始,再次要求用戶輸入。
當用戶輸入非數字時,滿足第二個if條件,給出提示,需要輸入純數字,同時執行continue,循環從頭開始,再次要求用戶輸入。
當用戶正確輸入時,直接執行break語句,跳出循環,並且輸出用戶輸入的數字。while [ 1 ] 可以換作 while : 或者while true

Linux學習總結(五十九)shell 腳本3-for while 循環