++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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