20.10 for循環
語法:for 變量名 in 條件; do …; done
#!/bin/bash
for i in `seq 1 100`
do
echo $i
done
案例1
#!/bin/bash
sum=0
for i in `seq 1 100`
do
sum=$[$sum+$i]
echo $i
done
echo $sum
[root@aiker02 script]# !vim
vim for0.sh
echo $i
#!/bin/bash
sum=0
for i in `seq 1 100`
do
sum=$[$sum+$i]
done
echo $sum
"for0.sh" 7L, 73C written
[root@aiker02 script]# sh -x !$
sh -x for0.sh
+ echo 5050
5050
[root@aiker02 script]# cat !$
cat for0.sh
#!/bin/bash
sum=0
for i in `seq 1 100`
do
echo "$sum+$i"
sum=$[$sum+$i]
echo $sum
done
[root@aiker02 script]# !v
vim for1.sh
#!/bin/bash
cd /etc/
for a in `ls /etc`
do
[ -d $a ] && ls $a
if [ -d $a ]
then
echo $a
echo "`pwd`/$a"
ls $a
fi
done
[root@aiker02 script]# for i in `seq 1 3`; do echo $i; done
1
2
3
[root@aiker02 script]# for i in 1 2 3; do echo $i; done
1
2
3
注意for在遍歷目錄時會把空格或者回車作爲分隔符
[root@aiker02 script]# ll
total 64
-rw-r--r-- 1 root root 0 Apr 15 16:27 1
-rw-r--r-- 1 root root 0 Apr 15 16:27 2
-rw-r--r-- 1 root root 0 Apr 15 16:27 3 4.txt
[root@aiker02 script]# mkdir textdir
[root@aiker02 script]# mv 1 2 3\ 4.txt textdir/
1234.txt
[root@aiker02 script]# for i in `ls ./textdir`; do echo $i; done
1
2
3
4.txt
[root@aiker02 script]# for i in `ls ./textdir`; do printf "$i\n"; done
1
2
3
4.txt
通常情況下 shell 變量調用需要加 $,但是 for 的 (()) 中不需要,下面來看一個例子:
#!/bin/bash
for((i=1;i<=5;i++));do
echo "這是第 $i 次調用";
done;
與 C 中相似,賦值和下一步執行可以放到代碼之前循環語句之中執行,這裏要注意一點:如果要在循環體中進行 for 中的 next 操作,記得變量要加 $,不然程序會變成死循環。
20.11/20.12 while循環
語法 while 條件; do … ; done
案例1
#!/bin/bash
while : ##:相當於true,可以使用while true
do
load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1`
if [ $load -gt 10 ]
then
/bin/mail.py [email protected] "load is high" $load
fi
sleep 30
done
[root@aiker02 script]# sh -x while0.sh
+ :
++ head -1
++ awk -F 'load average: ' '{print $2}'
++ cut -d. -f1
++ w
+ load=0
+ '[' 0 -gt 10 ']'
+ sleep 30
+ :
++ head -1
++ awk -F 'load average: ' '{print $2}'
++ cut -d. -f1
++ w
+ load=0
+ '[' 0 -gt 10 ']'
+ sleep 30
+ :
++ head -1
++ awk -F 'load average: ' '{print $2}'
++ cut -d. -f1
++ w
+ load=0
+ '[' 0 -gt 10 ']'
+ sleep 30
^C
while循環: 格式:
while command
do
command
command
command
...
done
[root@aiker02 script]# !vim
vim while1.sh
#!/bin/bash
while :
do
read -p "please input a number:" n
if [ -z $n ]
then
echo 'You need input a string.'
continue
fi
n1=`echo $n | sed 's/[0-9]//g'`
if [ -n "$n1" ]
then
echo "You must input numbers"
continue
fi
break
done
echo $n
[root@aiker02 script]# !sh
sh -x while1.sh
+ :
+ read -p 'please input a number:' n
please input a number:12323
+ '[' -z 12323 ']'
++ sed 's/[0-9]//g'
++ echo 12323
+ n1=
+ '[' -n '' ']'
+ break
+ echo 12323
12323
[root@aiker02 script]# !vim
vim while2.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
do sq=`expr $i \* $i`
echo $i $i的平方是 $sq
i=`expr $i + 1`
done
echo "Job is done."
[root@aiker02 script]# sh !$
sh while2.sh
1 1的平方是 1
2 2的平方是 4
3 3的平方是 9
4 4的平方是 16
5 5的平方是 25
Job is done.
20.13 break跳出循環
• 從循環中退出: break和continue命令 break 立即退出循環 continue 忽略本循環中的其他命令,繼續下一下循環 在shell編程中有時我們要用到進行無限循環的技巧,也就是說這種循環一直執行碰 到break或continue命令。這種無限循環通常是使用true或false命令開始的。UNIX 系統中的true總是返0值,而false則返回非零值。如下所示
while true until false
do do
command command
.... ....
command command
done done
break命令允許跳出所有循環(終止執行後面的所有循環)
[root@aiker02 script]# vim break.sh
#!/bin/bash
for i in `seq 1 5`
do
echo $i
if [ $i -eq 3 ]
then
break
fi
echo $i
done
echo "job is done"
[root@aiker02 script]# sh break.sh
1
1
2
2
3
job is done
[root@aiker02 script]# 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 'job is done'
job is done
20.14 continue結束本次循環
忽略continue之下的代碼,直接進行下一次循環
continue命令與break命令類似,只有一點差別,它不會跳出所有循環,僅僅跳出當前循環
[root@aiker02 script]# vim continue.sh
#!/bin/bash
for i in `seq 1 5`
do
echo $i
if [ $i -eq 3 ]
then
continue
fi
echo $i
done
echo "job is done"
[root@aiker02 script]# sh continue.sh
1
1
2
2
3
4
4
5
5
job is done
20.15 exit退出整個腳本
[root@aiker02 script]# cp continue.sh exit.sh
[root@aiker02 script]# vim !$
vim exit.sh
#!/bin/bash
for i in `seq 1 5`
do
echo $i
if [ $i -eq 3 ]
then
exit
fi
echo $i
done
echo "job is done"
[root@aiker02 script]# sh exit.sh
1
1
2
2
3
[root@aiker02 script]# !vim
vim exit.sh
#!/bin/bash
for i in `seq 1 5`
do
echo $i
if [ $i -eq 3 ]
then
exit 2
fi
echo $i
done
echo "job is done"
[root@aiker02 script]# sh exit.sh
1
1
2
2
3
[root@aiker02 script]# echo $?
2
擴展
select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html
select也是循環的一種,它比較適合用在用戶選擇的情況下。
比如,我們有一個這樣的需求,運行腳本後,讓用戶去選擇數字,選擇1,會運行w命令,選擇2運行top命令,選擇3運行free命令,選擇4退出。腳本這樣實現:
#!/bin/bash
echo "Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit"
echo
select command in w top free quit
do
case $command in
w)
w
;;
top)
top
;;
free)
free
;;
quit)
exit
;;
*)
echo "Please input a number:(1-4)."
;;
esac
done
執行結果如下:
sh select.sh
Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit
1) w
2) top
3) free
4) quit
#? 1
16:03:40 up 32 days, 2:42, 1 user, load average: 0.01, 0.08, 0.08
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 61.135.172.68 15:33 0.00s 0.02s 0.00s sh select.sh
#? 3
total used free shared buffers cached
Mem: 1020328 943736 76592 0 86840 263624
-/+ buffers/cache: 593272 427056
Swap: 2097144 44196 2052948
#?
我們發現,select會默認把序號對應的命令列出來,每次輸入一個數字,則會執行相應的命令,命令執行完後並不會退出腳本。它還會繼續讓我們再次輸如序號。序號前面的提示符,我們也是可以修改的,利用變量PS3即可,再次修改腳本如下:
#!/bin/bash
PS3="Please select a number: "
echo "Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit"
echo
select command in w top free quit
do
case $command in
w)
w
;;
top)
top
;;
free)
free
;;
quit)
exit
;;
*)
echo "Please input a number:(1-4)."
esac
done
如果想要腳本每次輸入一個序號後就自動退出,則需要再次更改腳本如下:
#!/bin/bash
PS3="Please select a number: "
echo "Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit"
echo
select command in w top free quit
do
case $command in
w)
w;exit
;;
top)
top;exit
;;
free)
free;exit
;;
quit)
exit
;;
*)
echo "Please input a number:(1-4).";exit
esac
done