shell之迴圈
阿新 • • 發佈:2020-12-28
一、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