++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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