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
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 $$i
echo '123456'|passwd --stdin $$i &>/dev/null
i=$(($i+1))
done
#!/bin/bash
PREFIX="user";i=1
while [ $i -lt 5 ]
do
userdel -r $$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 "
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
[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"
领取专属 10元无门槛券
私享最新 技术干货