1.循环结构 a.for循环 语法结构及特点 for 变量名 in 值列表 do 命令序列 done
例子:批量添加用户账号无规律 cat useradd.sh #!/bin/bash ULIST=$(cat /root/shdir/userlist.txt) for UNAME in $ULIST do useradd $UNAME echo '123456' | passwd --stdin $UNAME done
cat userdel.sh #!/bin/bash ULIST=$(cat /root/shdir/userlist.txt) for UNAME in $ULIST do userdel -r $UNAME done
c语言风格的for循环 for((初值;条件;步长)) do 命令序列 done
for((i=1;i<5;i )) do echo $i done
for循环结构批量检测主机的存活状态 cat checkping.sh #!/bin/bash IPADDR=$(cat /root/shdir/ipaddr.txt) for IP in $IPADDR do ping -c 3 -w 5 -i 0.2 $IP &>/dev/null if [ $? -eq 0 ];then echo "$IP is up" else echo "$IP is down" fi done
b.while/until循环
while循环结构 while 条件 do 命令 done 例子批量添加用户 #!/bin/bash PREFIX="user";i=1 while [ $i -lt 3 ] do useradd ${PREFIX}$i echo '123456'|passwd --stdin ${PREFIX}$i &>/dev/null i=$(($i 1)) done
#!/bin/bash PREFIX="user";i=1 while [ $i -lt 5 ] do userdel -r ${PREFIX}$i let i done
until循环结构 until条件测试 do 命令 done 2.服务脚本设计 a.case分支结构 语法结构及特点 case 变量值 in 模式1) 命令1;; 模式2) 命令2;; 模式3) 命令3;; *) 默认命令序列 esac 例:判断用户输入类型 #!/bin/bash KEY="KEY" until [ $KEY == 'EXIT' ] do read -p "请输入一个字符:" KEY case "$KEY" in [a-z]|[A-Z]) echo "字母";; [0-9]) echo "数字";; *) echo "其他" esac done
b.编写服务脚本
系统服务控制 查看服务列表,自启状态 chkconfig --list 服务名 chkconfig 服务名 on|off 启动停止重启服务 service 服务名 start stop restart /etc/init.d/服务名 start stop restart
基于case结构识别控制参数 例子: #!/bin/bash case "$1" in start) echo "启动服务...";; stop) echo "关闭服务...";; restart) $0 stop $0 start ;; *) echo "用法:$0 start|stop|restart" exit 1 esac
c.自建系统服务 建立一个服务脚本 /etc/init.d/myprog 能够响应start stop restart status控制参数 采用sleep作为测试程序 将程序交给chkconfig工具管理,设置使用级别启动停止顺序服务说明
[root@kvm shdir]# cat myprog #!/bin/bash #chkconfig 2345 10 95 #description:A test service script for MyProg case "$1" in start) echo "启动服务..." sleep 86400 & ;; stop) echo "停止服务..." pkill -9 sleep ;; restart) $0 stop $0 start ;; status) pgrep -l sleep &>/dev/null && echo "运行中..."||echo "未运行..." ;;
*) echo "用法:$0 {start|stop|restart|status}" exit 1 esac
chkconfig --add myprog chkconfig --list myprog chkconfig myprog on 3.函数及中断控制 a.shell函数 函数定义 function 函数名{ 命令序列 } 或者 函数名() { 命令序列 }
函数的调用 函数名 值1 值2
示例: [root@kvm shdir]# function add { > echo $(($1 $2)) > } [root@kvm shdir]# add 1 2
[root@kvm shdir]# mkcd() { > mkdir $1 > cd $1 > } [root@kvm shdir]# mkcd /opt/xixi [root@kvm xixi]# pwd /opt/xixi
函数炸弹,能够快速耗尽资源 .(){.|.&};.
b.脚本中断示例 cat brkwhile.sh #!/bin/bash while read -p "请输入待累加的整数(0表示结束:):" x do [ $x -eq 0 ] && break SUM=$[SUM x] done
echo "总和是:$SUM"
cat cntwhile.sh #!/bin/bash i=0 while [ $i -le 20 ] do let i [ $[i%6] -ne 0] && continue echo $[i*i] done
cat exit.sh #!/bin/bash if [ $# -ne 2 ];then echo "用法:$0 num1 num2" exit 10 fi expr $1 $2
shift迁移位置参数 cat mysum.sh #!/bin/bash SUM=0 while [ $# -gt 0 ] do let SUM=SUM $1 shift done echo "The SUM is :#SUM"