++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
until循环
while CONDITION; docondition-turedone为真时,进入循环until CONDITION; do循环体done为假时,进入循环
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
循环控制命令、语句:用于循环体中,用在条件判断的表达式上
continue [#]默认当前"循环体",提前结束# 提前结束#层循环体break [#]默认当前"循环",提前结束# 提前结束#层循环
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
创建死循环(注意会耗尽cpu时钟周期的..)
while true; do循环体doneuntil false; do循环体done
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
while遍历指定文件的每一行
while read line; do循环体done < /PATH/FROM/SOMEFILE
将行赋值给line变量
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C风格的for用法
避免了for生成列表,会消耗大量的内存空间
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式)); do循环体done
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
条件判断case
case 变量引用 inpattern)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=1declare -i sum=0until [ $i -gt 100 ]; dosum=$[$sum+$i]let i++doneecho "sum: $sum"
2、
示例:9x9#!/bin/bash#declare -i i=1until [ $i -gt 9 ]; dodeclare -i j=1until [ $j -gt $i ]; doecho -n -e "${j}X${i}=$(expr $i \* $j)\t"let j++doneecholet i++done
3、
示例: 添加10个用户 user1-user10#!/bin/bash#declare -i i=1declare -i users=0until [ $i -gt 10 ]; doif ! id user$i &> /dev/null; thenuseradd user$iecho "Add user user$i finished"let users+=1filet i++done
continue、break练习
1、
示例1:求100以内所有偶数之和,要求循环遍历100以内所有正整数#!/bin/bash#declare -i i=0declare -i sum=0until [ $i -gt 100 ]; dolet i++if [ $[$i%2] -eq 1 ]; thencontinuefilet sum+=$idoneecho "Even sum: $sum"
2、
示例2:每3秒判断一次docker用户,如果docker用户登陆,则记录目志并退出循环#!/bin/bash#if [ -z "$1" -o "$1" == "--help" ]; thenecho "Usage: $0"exit 1fiif ! id $1 &> /dev/null; thenecho "$1 is not exist"exit 2fiuntil false; dosleep 3if who | grep "^$1\>" &> /dev/null; thenbreakfidoneecho "$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=0while read line; doif [ $[$(echo $line | cut -d':' -f3)%2] -eq 0 ]; thenecho -e "$(echo $line | cut -d':' -f1,3 --output-delimiter=' ')\t"sum=$(($sum+1))fidone < /etc/passwdecho "Even sum of users: $sum"
C风格的for用法
1、
示例演示: 求100以内所有正整数之和#!/bin/bash#declare -i sum=0for ((i=1;i<=100;i++)); dolet sum+=$idoneecho "sum: $sum"
2、
示例: 9x9乘法表#!/bin/bash#for ((i=1;i<=9;i++)); dofor ((j=1;j<=i;j++)); doecho -e -n "${j}X${i}=$[$i*$j]\t"doneechodone
3、
练习:1、显示菜单cpu) show cpu infomationmem) show memory informationdisk) show disk informationquit) quit2、提示用户选择选项3、显示用户选择的内容进一步地:用户选择,并显示完成后不退出脚本,而是提示用户继续选择显示其它内容,直到使用quit退出#!/bin/bash#while true; docat << EOFcpu) show cpu infomationmem) show memory informationdisk) show disk informationquit) quitEOFread -p 'Enter a your choice: ' keycase $key incpu)x86info;;mem)vmstat -s;;disk)fdisk -l /dev/[sh]d[a-z];;quit)exit 0;;*)echo "only cpu | mem | disk | quit"continue;;esacdone
条件判断case
1、
练习:1)脚本可接受参数, start,stop,restart,status2)非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 Otherdeclare -i Start=1declare -i Stop=1declare -i Restart=1declare -i Stauts=1declare -i Other=1case $1 instart)Start=0;;stop)Stop=0;;restart)Restart=0;;status)Status=0;;*)Other=0;;esacif [ "$Start" == 0 ]; then[ ! -e $Lockfile ] && touch $Lockfile echo "$0 start finished"fiif [ "$Stop" == 0 ]; then[ -e $Lockfile ] && rm -rf $Lockfile echo "$0 stop finished"fiif [ "$Restart" == 0 ]; then[ -e $Lockfile ] && rm -rf $Lockfile echo "$0 stop finished"[ ! -e $Lockfile ] && touch $Lockfile echo "$0 start finished"fiif [ "$Status" == 0 ]; then [ -e $Lockfile ] && echo "$0 is running...." || echo "$0 is stopped..."fiif [ "$Other" == 0 ]; then echo "Usage:$0 {start|restart|stop|status}" exit 1fi
后续步骤1、查看脚本语法# bash -n x.sh2、给予执行权限# 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 [root@localhost bin]# chkconfig --list x.sh x.sh 0:off1:off2:off3:off4:off5:off6:off让2345级别处于on状态# chkconfig --levels 2345 x.sh on [root@localhost 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