case语句
#/bin/sh
case $1 in
1)
echo 1
;;
2)
echo 2
;;
a)
echo a
;;
*)
echo 'i do not know'
esac
$1
可以换为其他变量,case语句判断传入变量的值是否与其中的某个选项匹配,然后执行该选项的代码块,如果都不匹配执行最后的一个代码块- 每个选项最后以
;;
分隔,最后一个选项以esac
结束,表示case语句结束
案例1:批量删除用户
- 删除用户的前缀read -p "please input prefix: "pre
- 删除用户的数量read -p "用户数量": num
for i in {1..10};do useradd home$i;done
使用命令创建10个用户,用来执行删除操作- 通过case语句分支来执行不同的代码块,id命令判断是否存在该用户,执行后面的操作
#/bin/sh
read -p "please input prefix: " pre
read -p "用户数量": num
for i in `seq $num`
do
echo $pre$i
done
read -p "确定删除[y|Y|yes|n|N|no]": c
case $c in
y|Y|yes)
for j in `seq $num`
do
id $pre$j > /dev/null 2>&1
[ $? -eq 0 ] && userdel -r $pre$j
[ $? -eq 0 ] && echo '删除成功' || echo '删除失败'
done
;;
n|N|no)
echo '那就不删除了吧'
esac
案例2:要求使用菜单显示系统的资源使用情况(内存,磁盘,负载,登录用户,ip地址,linux版本)
#/bin/sh
menu(){
cat<<EOF
1.help帮助
2.显示内存使用
3.显示磁盘使用
4.显示系统负载
5.显示登陆用户
6.查看IP地址
7.查看Linux-version
8.退出
EOF
}
#显示菜单
menu
while true
do
read -p '请选择: ' c
case $c in
1 )
menu
;;
2 )
free -h
;;
3 )
df -h
;;
4 )
uptime
;;
5 )
w
;;
6 )
hostname -I
;;
7 )
cat /etc/redhat-release
;;
8 )
exit
;;
* )
esac
done
案例3:Nginx启动脚本
- 通过脚本控制Nginx,并结合case语句
- /usr/sbin/nginx : 启动
- /usr/sbin/nginx -s stop : 停止
- /usr/sbin/nginx -s reload : 重新加载
#/bin/sh
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
test()
{
if [ $? -eq 0 ];then
action "nginx $1 is" /bin/true
else
action "nginx $1 is" /bin/false
fi
}
case $1 in
start )
/usr/sbin/nginx > /dev/null 2>&1
test
;;
stop )
/usr/sbin/nginx -s stop > /dev/null 2>&1
test
;;
restart )
/usr/sbin/nginx -s stop > /dev/null 2>&1
sleep 1 > /dev/null 2>&1
/usr/sbin/nginx > /dev/null 2>&1
test
;;
reload )
/usr/sbin/nginx -s reload > /dev/null 2>&1
test
;;
status )
netstat -luntp|grep nginx
;;
* )
echo $0 '[start|stop|restart|reload|status]'
esac
案例4:jumpserver案例
- 脚本免秘钥连接目标服务器
- 使用case语句连接不同的目标服务器
- 加入一些其他手段防止脚本退出
- 可以将该脚本加入到开机启动脚本
/etc/rc.d/rc.local
中 - 将秘钥放到目标服务器点我
#/bin/sh
menu()
{
cat<<EOF
1.web01 10.0.0.7
2.web02 10.0.0.8
3.web03 10.0.0.9
4.显示菜单
EOF
}
menu
#禁用 ctrl+c 退出脚本
trap "echo 再乱按试试看" INT TSTP HUP
while true; do
read -p '请选择: ' c
case $c in
1 )
#如果实现免秘钥连接目标服务器需要先将秘钥放到目标服务器中
echo 'ssh 10.0.0.7'
;;
2 )
echo 'ssh 10.0.0.8'
;;
3 )
echo 'ssh 10.0.0.9'
;;
4 )
menu
;;
#预留退出脚本的后面
houmen )
exit
;;
* )
echo '无效的输入'
esac
done
while循环和控制语句
如果while循环条件为真,就执行循环体内的代码
while [条件表达式]
do
#循环体
done
从第一行开始读取文件的每一行,每读取一行就循环一次,变量的值为该行的内容,
done
后面输入读取的文件
while read line
do
#循环体
done<test.txt
案例:使用while循环读取文本创建用户名和密码
- 文本内容
#user.txt
zhangsan 123456
lisi 654321
wangwu 112233
- 脚本内容
#/bin/sh
while read line
do
user=`echo $line|awk '{print $1}'`
pass=`echo $line|awk '{print $2}'`
useradd $user;echo $pass|passwd --stdin $user
done<user.txt
控制语句
- exit : 结束程序
- break : 退出当前循环
- continue : 立即结束当次循环,进行下次循环
最后一次更新于2020-02-08 19:54
0 条评论