謝煙客---------Linux之腳本編程---until,for,case
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
until循環
while CONDITION; do condition-ture done 為真時,進入循環 until CONDITION; do 循環體 done 為假時,進入循環
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
循環控制命令、語句:用於循環體中,用在條件判斷的表達式上
continue [#] 默認當前"循環體",提前結束 # 提前結束#層循環體 break [#] 默認當前"循環",提前結束 # 提前結束#層循環
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
創建死循環(註意會耗盡cpu時鐘周期的..)
while true; do 循環體 done until false; do 循環體 done
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
while遍歷指定文件的每一行
while read line; do 循環體 done < /PATH/FROM/SOMEFILE
將行賦值給line變量
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C風格的for用法
避免了for生成列表,會消耗大量的內存空間
for ((控制變量初始化;條件判斷表達式;控制變量的修正表達式)); do 循環體 done
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
條件判斷case
case 變量引用 in pattern) statement ;; pattern) statement ;; ... *) statement ;; esac
pattern支持 glob
until練習
示例:求100以內所有正整數和
示例:9x9
示例: 添加10個用戶 user1-user10
continue、break練習
示例1:求100以內所有偶數之和,要求循環遍歷100以內所有正整數
示例2:每3秒判斷一次docker用戶,如果docker用戶登陸,則記錄目誌並退出循環
while遍歷文件練習
示例:將ID號為偶數的所有用戶,顯示其用戶的用戶名
C風格的for用法
示例: 9x9乘法表
練習:
1、顯示菜單
cpu) show cpu infomation
mem) show memory information
disk) show disk information
quit) quit
2、提示用戶選擇選項
3、顯示用戶選擇的內容
進一步地:
用戶選擇,並顯示完成後不退出腳本,而是提示用戶繼續選擇顯示其它內容,直到使用quit退出
條件判斷case
練習:
1)腳本可接受參數, start,stop,restart,status
2)非4者之一,提示使用格式並退出
3)start時,創建/var/lock/subsys/SCRIPT_NAME,並顯示"啟動成功"
考慮:事先啟動過一次,該如何處理
4)stop時,則刪除/var/lock/subsys/SCRIPT_NAME,並顯示"停止完成"
考慮:如果事先已然停止過了,該如何處理?
5)restart時,先stop,再start
考慮:如果本來沒有start,如何處理
6)如何是status,
/var/lock/subsys/SCRIPT_NAME文件存在,則顯示"SCRIPT_NAME is running..."
/var/lock/subsys/SCRIPT_NAME文件不存在,則顯示"SCRIPT_NAME is stopped..."
其中:SCRIPT_NAME為當前腳本名。$0
until練習
1、
示例:求100以內所有正整數和 #!/bin/bash # declare -i i=1 declare -i sum=0 until [ $i -gt 100 ]; do sum=$[$sum+$i] let i++ done echo "sum: $sum"
2、
示例:9x9 #!/bin/bash # declare -i i=1 until [ $i -gt 9 ]; do declare -i j=1 until [ $j -gt $i ]; do echo -n -e "${j}X${i}=$(expr $i \* $j)\t" let j++ done echo let i++ done
3、
示例: 添加10個用戶 user1-user10 #!/bin/bash # declare -i i=1 declare -i users=0 until [ $i -gt 10 ]; do if ! id user$i &> /dev/null; then useradd user$i echo "Add user user$i finished" let users+=1 fi let i++ done
continue、break練習
1、
示例1:求100以內所有偶數之和,要求循環遍歷100以內所有正整數 #!/bin/bash # declare -i i=0 declare -i sum=0 until [ $i -gt 100 ]; do let i++ if [ $[$i%2] -eq 1 ]; then continue fi let sum+=$i done echo "Even sum: $sum"
2、
示例2:每3秒判斷一次docker用戶,如果docker用戶登陸,則記錄目誌並退出循環 #!/bin/bash # if [ -z "$1" -o "$1" == "--help" ]; then echo "Usage: $0 <username>" exit 1 fi if ! id $1 &> /dev/null; then echo "$1 is not exist" exit 2 fi until false; do sleep 3 if who | grep "^$1\>" &> /dev/null; then break fi done echo "$1 login at $(date +%F_%T)" >> /tmp/user_login.log 判斷: # bash -n a.sh 運行: # bash a.sh docker &
while遍歷文件練習
1、
示例:將ID號為偶數的所有用戶,顯示其用戶的用戶名 #!/bin/bash # declare -i sum=0 while read line; do if [ $[$(echo $line | cut -d‘:‘ -f3)%2] -eq 0 ]; then echo -e "$(echo $line | cut -d‘:‘ -f1,3 --output-delimiter=‘ ‘)\t" sum=$(($sum+1)) fi done < /etc/passwd echo "Even sum of users: $sum"
C風格的for用法
1、
示例演示: 求100以內所有正整數之和 #!/bin/bash # declare -i sum=0 for ((i=1;i<=100;i++)); do let sum+=$i done echo "sum: $sum"
2、
示例: 9x9乘法表 #!/bin/bash # for ((i=1;i<=9;i++)); do for ((j=1;j<=i;j++)); do echo -e -n "${j}X${i}=$[$i*$j]\t" done echo done
3、
練習: 1、顯示菜單 cpu) show cpu infomation mem) show memory information disk) show disk information quit) quit 2、提示用戶選擇選項 3、顯示用戶選擇的內容 進一步地: 用戶選擇,並顯示完成後不退出腳本,而是提示用戶繼續選擇顯示其它內容,直到使用quit退出 #!/bin/bash # while true; do cat << EOF cpu) show cpu infomation mem) show memory information disk) show disk information quit) quit EOF read -p ‘Enter a your choice: ‘ key case $key in cpu) x86info ;; mem) vmstat -s ;; disk) fdisk -l /dev/[sh]d[a-z] ;; quit) exit 0 ;; *) echo "only cpu | mem | disk | quit" continue ;; esac done
條件判斷case
1、
練習: 1)腳本可接受參數, start,stop,restart,status 2)非4者之一,提示使用格式並退出 3)start時,創建/var/lock/subsys/SCRIPT_NAME,並顯示"啟動成功" 考慮:事先啟動過一次,該如何處理 4)stop時,則刪除/var/lock/subsys/SCRIPT_NAME,並顯示"停止完成" 考慮:如果事先已然停止過了,該如何處理? 5)restart時,先stop,再start 考慮:如果本來沒有start,如何處理 6)如何是status, /var/lock/subsys/SCRIPT_NAME文件存在,則顯示"SCRIPT_NAME is running..." /var/lock/subsys/SCRIPT_NAME文件不存在,則顯示"SCRIPT_NAME is stopped..." 其中:SCRIPT_NAME為當前腳本名。$0 #!/bin/bash # chkconfig: - 88 12 # description: Lcc.org ######################### SrvName=$(echo $0 | sed ‘s,/$,,‘ | sed -r ‘s|(.*/)([^/]+)|\2|‘) Lockfile=/var/lock/subsys/$SrvName ######################### unset Start Stop Restart Stauts Other declare -i Start=1 declare -i Stop=1 declare -i Restart=1 declare -i Stauts=1 declare -i Other=1 case $1 in start) Start=0 ;; stop) Stop=0 ;; restart) Restart=0 ;; status) Status=0 ;; *) Other=0 ;; esac if [ "$Start" == 0 ]; then [ ! -e $Lockfile ] && touch $Lockfile echo "$0 start finished" fi if [ "$Stop" == 0 ]; then [ -e $Lockfile ] && rm -rf $Lockfile echo "$0 stop finished" fi if [ "$Restart" == 0 ]; then [ -e $Lockfile ] && rm -rf $Lockfile echo "$0 stop finished" [ ! -e $Lockfile ] && touch $Lockfile echo "$0 start finished" fi if [ "$Status" == 0 ]; then [ -e $Lockfile ] && echo "$0 is running...." || echo "$0 is stopped..." fi if [ "$Other" == 0 ]; then echo "Usage:$0 {start|restart|stop|status}" exit 1 fi
後續步驟 1、查看腳本語法 # bash -n x.sh 2、給予執行權限 # chmod +x x.sh 嘗試加入服務 1、明確腳本是否遵循LSB風格 # chkconfig: - 88 12 # description: lcc.org 2、復制至/etc/rc.d/init.d/目錄中 # cp x.sh /etc/init.d/ 3、加入服務中 # chkconfig --add x.sh 查看服務: # chkconfig --list x.sh [[email protected] bin]# chkconfig --list x.sh x.sh 0:off1:off2:off3:off4:off5:off6:off 讓2345級別處於on狀態 # chkconfig --levels 2345 x.sh on [[email protected] bin]# chkconfig --list x.sh x.sh 0:off1:off2:on3:on4:on5:on6:off
測試用service控制 開啟服務:service x.sh start 關閉服務: service x.sh stop 查看狀態: service x.sh status 重啟服務: service x.sh restart
本文出自 “Reading” 博客,請務必保留此出處http://sonlich.blog.51cto.com/12825953/1964166
謝煙客---------Linux之腳本編程---until,for,case