語法: for 變量名 in 條件;do ...; done
舉例1 python
#!/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命令,另外一種爲循環。
方法一:linux
#!/bin/bash find /123/ -type f -name "*.txt" |xargs -i mv{} {}.bak
方法二:bash
#!/bin/bash cd /123/ for f in `ls *.txt`;do mv $f $f.bak done
語法: while 條件;do ... ;doneide
#!/bin/bash sum=0 i=1 while [ $i -le 100 ] do sum=`expr $sum + $i` i=`expr $i + 1` done echo $sum
一般咱們寫一個監控腳本能夠用while作一個死循環。
每隔半分鐘查看下系統負載,當負載高於10時發送郵件通知。code
#!/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 lvlinux@163.com "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不支持字符串做爲切割符。ip
忽略掉本次循環的操做,直接進入下一次循環。字符串
#!/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的操做。input
碰到break語句,直接跳出當前循環。it
#!/bin/bash for i in `seq 1 5`;do if [ $i -eq 4 ];then break fi echo $i done
運行結果爲1 2 3。當循環到4時,直接跳出循環,再也不執行循環中任何語句。class
碰到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
需求:提示用戶輸入數字,若不輸入,則提示輸入內容,若輸入不是純數字,則提示輸入數字,直到正確輸入爲止
#!/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