1. 程式人生 > 實用技巧 >shell之迴圈

shell之迴圈

一、for迴圈語句

1.1 for迴圈語句結構

1)列表迴圈

列表for迴圈:用於將一組命令執行已知的次數!

語法結構:

for variable in {list}
     do
          command 
          command
          …
     done

或者

for variable in a b c
     do
         command
         command
     done

舉例說明:

# for var in {1..10};do echo $var;done
# for var in 1 2 3 4 5;do echo $var;done
# for var in `seq 10`;do echo $var;done
# for var in $(seq 10);do echo $var;done
# for var in {0..10..2};do echo $var;done
# for var in {2..10..2};do echo $var;done
# for var in {10..1};do echo $var;done
# for var in {10..1..-2};do echo $var;done
# for var in `seq 10 -2 1`;do echo $var;done
2)不帶列表迴圈

不帶列表的for迴圈:執行時由使用者指定引數和引數的個數!

語法結構:

for variable
    do
        command 
        command
        …
   done

舉例說明:

#!/bin/bash
for var
do
echo $var
done

echo "指令碼後面有$#個引數"
3)類C風格的for迴圈

基本語法:

for(( expr1;expr2;expr3 ))
    do
        command
        command
        …
    done

expr1:定義變數並賦初值
expr2:決定是否進行迴圈(條件)
expr3:決定迴圈變數如何改變,決定迴圈什麼時候退出

舉例說明:

 # for ((i=1;i<=5;i++));do echo $i;done
 # for ((i=1;i<=10;i+=2));do echo $i;done
 # for ((i=2;i<=10;i+=2));do echo $i;done

2.2 應用示例

1)指令碼計算1~100的奇數的和
#!/bin/bash

# 定義變數來儲存奇數和
sum=0

#for迴圈遍歷1-100的奇數,並且相加,把結果重新賦值給sum
for i in {1..100..2}
do
    let sum=$sum+$i
done
#列印所有奇數的和
echo "1-100的奇數和是:$sum"

控制迴圈語句的引數:

  • continue:繼續;表示迴圈體內的程式碼不再執行,直接開始下一次迴圈;
  • break:打斷;馬上停止執行本次迴圈,執行迴圈體後的程式碼;
  • exit:表示直接跳出程式;
#!/bin/bash
for i in {1..5}
do
    test $i -eq 2 && break || touch /tmp/file$i
done
#當指令碼等於2時,停止迴圈,指令碼結束
2)批量建立使用者

批量加5個新使用者,以u1到u5命名,並統一加一個新組,組名為class,統一改密碼為123 !

#!/bin/bash
#判斷class組是否存在
grep -w class /etc/group &>/dev/null
[ $? -ne 0 ] && groupadd class
#批量建立5個使用者
for i in {1..5}
do
    useradd -G class u$i
    echo 123|passwd --stdin u$i
done

批量新建5個使用者stu1~stu5,要求這幾個使用者的家目錄都在/rhome !

#!/bin/bash
#判斷/rhome是否存在
[ -f /rhome ] && mv /rhome /rhome.bak
test ! -f /rhome -a ! -d /rhome && mkdir /rhome
#建立使用者,迴圈5次
for ((i=1;i<=5;i++))
do
    useradd -d /rhome/stu$i stu$i
    echo 123|passwd --stdin stu$i
done
3)區域網網內指令碼檢查網路是否可以正常通訊

寫一個指令碼,區域網內,把能ping通的IP和不能ping通的IP分類,並儲存到兩個文字檔案裡!

#!/bin/bash
#定義變數
ip=10.1.1
#迴圈去ping主機的IP
for ((i=1;i<=254;i++))
do
    ping -c1 $ip.$i &>/dev/null
    if [ $? -eq 0 ];then
        echo "$ip.$i is ok" >> /tmp/ip_up.txt
    else
        echo "$ip.$i is down" >> /tmp/ip_down.txt
    fi
done	

shell指令碼並行處理:

並行執行:
{程式}&表示將程式放到後臺並行執行,如果需要等待程式執行完畢再進行下面內容,需要加wait

#!/bin/bash
#定義變數
ip=10.1.1
#迴圈去ping主機的IP
for ((i=1;i<=254;i++))
do
{

        ping -c1 $ip.$i &>/dev/null
        if [ $? -eq 0 ];then
                echo "$ip.$i is ok" >> /tmp/ip_up.txt
        else
                echo "$ip.$i is down" >> /tmp/ip_down.txt
        fi
}&
done
wait
echo "ip is ok...."
4)判斷閏年

輸入一個年份,判斷是否是潤年(能被4整除但不能被100整除,或能被400整除的年份即為閏年)!

#!/bin/bash
read -p "Please input year:" year
if [ $[$year%4] -eq 0 -a $[$year%100] -ne 0 ];then
    echo "$year is leap year"
elif [ $[$year%400] -eq 0 ];then
    echo "$year is leap year"
else
    echo "$year is not leap year"
fi

二、while迴圈語句

while迴圈語句的特點:條件為真就進入迴圈,條件為假就退出迴圈!

2.1 while迴圈語法結構

while 表示式
do
        command...
done

或者

while  [ 1 -eq 1 ] 或者 (( 1 > 2 ))
do
     command
     command
     ...
done

迴圈列印1~5數字

#for迴圈列印
for ((i=1;i<=5;i++))
do
    echo $i
done
#while迴圈列印
i=1
while [ $i -le 5 ]
do
    echo $i
    let i++
done

2.2 應用示例

1)計算1~50偶數的和
#!/bin/bash
#定義變數
sum=0
i=2
#迴圈列印1-50的偶數和並且計算後重新賦值給sum
while [ $i -le 50 ]
do
    let sum=sum+i
    let i+=2
done
#列印sum的值
echo "1-50的偶數和為:$sum"
2)指令碼同步系統時間
#!/bin/bash
#定義變數
count=0
ntp_server=10.1.1.1
while true
do
    rdate -s $ntp-server &>/dev/null
    if [ $? -ne 0 ];then
        echo "system date failed" |mail -s 'check system date'  root@localhost  
    else
        let count++
        if [ $[$count%100] -eq 0 ];then
        echo "system date successfull" |mail -s 'check system date'  root@localhost && count=0
        fi
    fi
sleep 3
done

三、until迴圈

until迴圈特點:條件為假進入迴圈,條件為真退出迴圈!

3.1 until迴圈語句結構

until 表示式
do
        command
        command
        ...
done

迴圈列印1~5數字

#while迴圈列印
i=1
while [ $i -le 5 ]
do
    echo $i
    let i++
done
#until迴圈列印
i=1
until [ $i -gt 5 ]
do
    echo $i
    let i++
done

3.2 應用示例

1)使用until語句批量建立10個使用者,要求stu1—stu5使用者的UID分別為1001—1005;
2)stu6~stu10使用者的家目錄分別在/rhome/stu6—/rhome/stu10

#!/bin/bash
i=1
until [ $i -gt 10 ]
do
    if [ $i -le 5 ];then
        useradd -u $[1000+$i] stu$i && echo 123|passwd --stdin stu$i
    else
        [ ! -d /rhome ] && mkdir /rhome
        useradd -d /rhome/stu$i stu$i && echo 123|passwd --stdin stu$i      
    fi
let i++
done