循環結構
循環執行: 講一段代碼重復執行一次或多次 進入條件:條件滿足時進入循環 退出條件:每一個循環都應該有退出條件,以有機會退出循環; bash腳本有三種循環方式: for循環: while循環: until循環: for循環: 兩種格式: (1)遍歷列表的格式 (2)通過控制變量來控制循環次數的方式 遍歷列表: for VARAIBLE in LIST;do 循環體 done 進入條件:只要列表有可用元素,即可進入循環。 退出條件:列表中的元素遍歷完成 LIST的生成方式: (1):直接給出 (2):整數列表 (a){start..end} (b)seq [start] [incremtal] last (3)返回列表的命令 (4)glob (5)變量引用 $@ $# #!/bin/bash # for username in user24 user25 user26; do if id $username &> /dev/null;then echo "$username exists" else useradd $username && echo "Add user $username finished." fi done [root@localhost ~]# bash -x /root/for/for1.sh + for username in user24 user25 user26 + id user24 + useradd user24 + echo 'Add user user24 finished.' Add user user24 finished. + for username in user24 user25 user26 + id user25 + useradd user25 + echo 'Add user user25 finished.' Add user user25 finished. + for username in user24 user25 user26 + id user26 + useradd user26 + echo 'Add user user26 finished.' Add user user26 finished. 上面是簡單的使用for循環的方式 實例:求100以內所有正整數之和; #!/bin/bash # declare -i sum=0 for i in {1..100};do sum=$[$sum+$i] done echo $sum [root@localhost ~]# bash /root/for/sum.sh 5050 while循環: while CONDITION; do 循環體 done CONDITION :循環控制條件;進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;條件為“true” ,則執行一次循環;直到條件測試狀態為“false” 終止循環 因此:CONDTION 一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正 進入條件:CONDITION 為true; 退出條件:CONDITION 為false until循環: until CONDITION; do 循環體 done 進入條件: CONDITION 為false 退出條件: CONDITION 為true 循環控制語句:continue 用于循環體中 continue [N] :提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層 while CONDTIITON1; do CMD1 ... if CONDITION2; then continue fi CMDn ... done 實例: #!/bin/bash # # # i=0 while [ $i -lt 9 ];do let i++ [ $i -eq 5 ] && continue echo "$i" done [root@localhost ~]# bash /root/tiaochu/continue.sh 1 2 3 4 6 7 8 9 [root@localhost ~]# 前期運行錯誤分析: 代碼如下: #!/bin/bash # # # i=0 while [ $i -lt 9 ];do [ $i -eq 5 ] && continue echo "$i" let i++ done 運行結果如下: [root@localhost ~]# bash /root/tiaochu/continue.sh 0 1 2 3 4 腳本沒有跳出本次循環執行下次循環,也沒有退出程序。 分析后得出結果:在循環中,代碼let i++寫在了continue跳出語句的后面,導致變量i的值一直處于符合跳出條件i=5,所以每次執行的都是跳出本次循環的操作。無法執行下面的let i++。修改后如此前寫的那樣,程序正常運行。在后面的操作中要注意此類問題。?。。。。?! 循環控制語句:break 用于循環體中 break [N] :提前結束第N層循環,最內層為第1層 while CONDTIITON1; do CMD1 ... if CONDITION2; then break fi CMDn ... done 實例: #!/bin/bash # # # i=0 while [ $i -lt 9 ];do [ $i -eq 5 ] && break echo "$i" let i++ done [root@localhost ~]# bash /root/tiaochu/continue.sh 0 1 2 3 4 [root@localhost ~]# 對于在使用continue中遇到的問題,在break語句中不會出現同樣的情況,應為continue語句是跳出當前正在執行的本輪循環,而break語句是跳出整個循環程序。 創建無限循環 while true; do 循環體 done until false; do 循環體 done 1 、判斷/var/ 目錄下所有文件的類型 filetype.sh #!/bin/bash # for filename in /var/* ;do if [[ -S $filename ]];then echo "Socket file" elif [[ -L $filename ]];then echo "Symbolic file" elif [[ -d $filename ]];then echo "Directory file" elif [[ -b $filename ]];then echo " Block special file" elif [[ -c $filename ]];then echo "character special file" elif [[ -p $filename ]];then echo "Named pipe file" elif [[ -f $filename ]];then echo "Common file" else echo "Other file" fi done 2、 、 添加10個 用戶user1-user10 ,密碼 同 用戶名 useradd.sh #!/bin/bash # for username in {20..30};do if id user$username &> /dev/null;then echo "user$username"|passwd --stdin user$username &> /dev/null else useradd user$username echo "user$username"|passwd --stdin user$username &> /dev/null echo "add user user$username finished." fi done 3 、/etc/rc.d/rc3.d 目錄下分別有多個以K 開頭和以S 開頭的 文件 ;分別 讀取每個文件,以K 開頭的文件輸出為文件加stop ,以S 開頭的文件輸出為文件名加start; ; “ “K34filename stop” “S66filename start” fileadd.sh #!/bin/bash # for filename in /etc/rc.d/rc3.d/*;do if [[ $filename =~ /.*/+[kK].*$ ]];then echo "$filename" |sed -r 's@/.*/+([kK].*)$@\1@' &> /dev/null echo "${filename}stop" elif [[ $filename =~ /.*/+[sS].*$ ]];then echo "$filename" |sed -r 's@/.*/+([Ss].*)$@\1@' &> /dev/null echo "${filename}start" else echo "Other" fi done 4 、編寫腳本 ,提示輸入正整數n 的值,計算1+2+3+…n 的總 和 numsum.sh #!/bin/bash # read -p "enter a integer::" num sum=0 if [ -n $num -a $num -gt 0 ];then expr $num + 0 &> /dev/null if [ `echo $?` -eq 0 ];then for i in `seq 1 $num`;do sum=$[$sum+$i] done echo "$sum" else echo "enter a integer" fi else echo "enter a integer" fi 5、 、 打印九九乘法表 chengfabiao.sh #!/bin/bash # #!/bin/bash # # read -p "請輸入要打印的行數::" n echo "==========================================" for i in `seq $n` do kd=$[$n-$i] for k in `seq $kd` do echo -n " " done qd=$[2*$i-1] for q in `seq $qd` do echo -n "*" done echo done echo "==========================================" for ((i=1;i<=n;i++)) do for ((k=1;k<=n-i;k++)) do echo -n " " done for ((j=1;j<=2*i-1;j++)) do echo -n "*" done echo done echo "==========================================" i=1 while [ $i -le $n ] do j=1 k=$[$n-$i] while [ $j -le $k ] do echo -n " " ((j++)) done q=1 qd=$[2*$i-1] while [ $q -le $qd ] do echo -n "*" ((q++)) done echo ((i++)) done echo "==========================================" i=1 until [ $i -gt $n ] do j=1 k=$[$n-$i] until [ $j -gt $k ] do echo -n " " ((j++)) done q=1 qd=$[2*$i-1] until [ $q -gt $qd ] do echo -n "*" ((q++)) done echo ((i++)) done echo "=========================================="
原創文章,作者:dxkboke,如若轉載,請注明出處:http://www.www58058.com/38586
腳本的學習沒有捷徑,再理清楚基本語法后剩下的是多寫,多看優秀代碼,這樣才能寫出優秀的腳本,建議有時間去找找一些生產環境中實用的腳本,學習寫寫,作業完成的很好,繼續保持。