bash循環

bash腳本-循環02

 
bash腳本編程:循環
執行流程:
1.順序執行
2.選擇執行:if
3.循環執行:for,while,until

1.循環執行的條件

進入條件:
for:列表元素非空
while:條件測試結果爲「真」
until:條件測試結果爲「假」
 
推出條件:
for:列表元素遍歷完成
while:條件測試結果爲「假」
until:條件測試結果爲「真」

2.循環控制語句:continue,break,sleep

2.1continue

提早結束本輪循環,而直接進入下一輪循環判斷
  1. while CONDITION1;do
  2. cmd1
  3. ...
  4. if condition2;then
  5. continue
  6. fi
  7. cmd2
  8. ...
  9. done
例:求100之內全部偶數之和
  1. #/bin/bash
  2. #
  3. declare -i sum=0
  4. declare -i i=0
  5. while [ $i -le 100 ];do
  6. let i++
  7. if [ $[$i%2] -eq 1 ];then
  8. continue
  9. fi
  10. let sum+=$i
  11. done
  12. echo "sum is $sum"

2.2 break

提早跳出循環
  1. while CONDITION1;do
  2. CMD1
  3. if CONDITION2;then
  4. break
  5. fi
  6. done
建立死循環
  1. while true;do
  2. 循環體
  3. done
退出方式:某個測試條件知足以後,讓循環體執行break命令
例:求100之內全部奇數之和
  1. #!/bin/bash
  2. declare -i sum=0
  3. declare -i i=1
  4. while true;do
  5. let sum+=$i
  6. let i+=2
  7. if [ $i -gt 100 ];then
  8. break
  9. fi
  10. done
  11. echo "sum is $sum"
2.3 sleep命令
sleep-delay for a specified amount of time
sleep NUMBER
下面經過一個例子說明sleep的用法
例:每隔3秒鐘到系統上獲取已經登陸用戶的用戶的信息;其中,若是zhangpf用戶登陸了系統,則記錄於日誌中,並退出;
方法1
  1. #!/bin/bash
  2. name=zhangpf
  3. until (who | grep "^$name\>" &> /dev/null);do
  4. echo $?
  5. sleep 3
  6. done
  7. echo "$(date +"%F-%T") $name logged on" >> /tmp/sleep.log
方法2
  1. #!/bin/bash
  2. name=zhangpf
  3. while true;do
  4. if who | grep "^$name\>" &> /dev/null;then
  5. break
  6. fi
  7. sleep 3
  8. done
  9. echo "$(date +"%F-%T") $name logged on" >> /tmp/login.log

3.循環體的特殊用法

3.1 while循環的特殊用法(遍歷文件的行)

  1. while read VARIABLE;do
  2. 循環體;
  3. done < /path/to/somefile
  4. #依次讀取/path/to/somefile文件中的每一行,且將基賦值給VARIABLE變量;
下面經過示例說明:
示例:找出UID爲偶數爲的用戶,顯示其用戶名、ID及默認shell
  1. #!/bin/bash
  2. while read line;do
  3. id=$(echo $line | cut -d: -f3)
  4. name=$(echo $line | cut -d: -f1)
  5. shell=$(echo $line | cut -d: -f7)
  6. if [ $[$id%2] -eq 1 ];then
  7. echo "$name,$id,$shell."
  8. fi
  9. done < /etc/passwd
3.2 for的特殊用法:
  1. for ((控制變量初始化;條件判斷表達式;控制變量的修正語句));do
  2. 循環體
  3. done
控制變量初始化:僅在循環代碼開始運行時執行一次
控制變量的修正語句:每輪循環結束會先進行控制變量修正運算,然後再作條件判斷
示例:
  1. #!/bin/bash
  2. declare -i sum=0
  3. for ((i=0;i<=100;i++));do
  4. let sum+=$i
  5. done
  6. echo "sum=$sum"
打印九九乘法表:
  1. #!/bin/bash
  2. for ((i=1;i<=9;i++));do
  3. for ((j=1;j<=i;j++));do
  4. echo -e -n "${i}X${j}=$[${i}*${j}]\t"
  5. done
  6. echo
  7. done

4.bash語句之case語句

case語句的語法格式:
  1. case $VARIABLE in
  2. PAT1)
  3. 分支1
  4. ;;
  5. PAT2)
  6. 分支2
  7. ;;
  8. 。。。。
  9. *)
  10. 分支n
  11. ;;
  12. esac
case支持glob風格的通配符:
*:任意長度的任意字符
?:任意單個字符
[]:範圍內任意單個字符
a|b:a或b
 
示例:寫一個服務框架腳本$lockfile,  值/var/lock/subsys/SCRIPT_NAME
                (1) 此腳本可接受start, stop, restart, status四個參數之一;
                (2) 若是參數非此四者,則提示使用幫助後退出;
                (3) start,則建立lockfile,並顯示啓動;stop,則刪除lockfile,並顯示中止;restart,則先刪除此文件再建立此文件,然後顯示重啓完成;status,若是lockfile存在,則顯示running,不然,則顯示爲stopped.
  1. #!/bin/bash
  2. #version 0.0.1
  3. #author:zhangpf
  4. #date:2016.07
  5. #description:this just a test.
  6. #
  7. prog=$(basename $0)
  8. lockfile=/var/lock/subsys/$prog
  9. case $1 in
  10. start)
  11. if [ -f $lockfile ];then
  12. echo "$prog is running yet."
  13. else
  14. touch $lockfile
  15. [ $? -eq 0 ] && echo "start $prog finished."
  16. fi
  17. ;;
  18. stop)
  19. if [ -f $lockfile ];then
  20. rm -f $lockfile
  21. [ $? -eq 0 ] && echo "stop $prog is finished."
  22. else
  23. echo "$prog is not running."
  24. fi
  25. ;;
  26. restart)
  27. if [ -f $lockfile ];then
  28. rm -f $lockfile
  29. touch $lockfile
  30. echo "restart $prog finished."
  31. else
  32. touch -f $lockfile
  33. echo "start $prog finished."
  34. fi
  35. ;;
  36. status)
  37. if [ -f $lockfile ];then
  38. echo "$prog is running."
  39. else
  40. echo "$prog is stopped."
  41. fi
  42. ;;
  43. *)
  44. echo "Usage:$prog {start|stop|restart|status}"
  45. exit 1
  46. esac
相關文章
相關標籤/搜索