shell阶段-day6-case语句与select语句
文章目录
流程控制之case语句
一、语法
case 变量 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
模式3)
命令序列3
;;
*)
无匹配后命令序列
esac
二、案例
1、检测用户身份
检测用户身份:管理员/普通用户/默认用户/其他用户
[root@m01 shell]# vim check_user.sh
#!/bin/bash
read -p "username: " -t 5 username
echo
if [ -z $username ];then
username="default"
fi
case $username in
root)
echo "管理员用户"
;;
egon)
echo "普通用户"
;;
default)
echo "默认用户"
;;
*)
echo "其他用户"
esac
2、检查nginx启动存活脚本
检查nginx是否启动,若没启动则启动,若启动则打印启动状态
[root@egon shell]# cat nginx_stat.sh
#!/bin/bash
. /etc/init.d/functions
if [ $# -ne 1 ]
then
echo "USAGE $0 {start|stop|restart}"
exit 1
fi
if [ "$1" == "start" ]
then
action "start nginx" /bin/true
elif [ "$1" == "stop" ]
then
action "stop nginx" /bin/true
elif [ "$1" == "restart" ]
then
action "restart nginx" /bin/true
else
echo "USAGE $0 {start|stop|restart}"
exit 1
fi
[root@egon shell]# chmod +x nginx_stat.sh
[root@egon shell]# ./nginx_stat.sh start
start nginx [ 确定 ]
[root@egon shell]# ./nginx_stat.sh restart
restart nginx [ 确定 ]
[root@egon shell]# ./nginx_stat.sh
USAGE ./nginx_stat.sh {start|stop|restart}
3、通过端口检查并配置nginx存活
# 储备知识1
netstat -lntup|grep ":80\b" # 过滤nginx的80端口,\b锚定单词的结尾
# 储备知识2
action:打印一段信息并执行给定的命令,然后根据给定命令的执行的结果来调用 success,failure方法,确定最终显示的内容
[root@egon shell]# action "nginx start is" :
nginx start is [ 确定 ]
[root@egon shell]# action "nginx start is" /bin/true
nginx start is [ 确定 ]
[root@egon shell]# action "nginx start is" /bin/false
nginx start is [失败]
# 编写代码
[root@egon shell]# vim nginx_stat.sh
#!/bin/bash
. /etc/init.d/functions
args=$1
fun(){
[ $? -eq 0 ] && action "Nginx $args is " /bin/true || echo "Nginx $args is " /bin/false
}
case $1 in
start)
netstat -an | grep -i Listen | grep -q "\b80\b"
if [ $? -eq 0 ]
then
echo "Nginx is runing..."
else
/usr/sbin/nginx
fun
fi
;;
stop)
/usr/sbin/nginx -s stop
fun
;;
reload)
/usr/sbin/nginx -s reload
fun
;;
restart)
netstat -lntup|grep ":80\b" &>/dev/null
if [ $? -ne 0 ]
then
/usr/sbin/nginx
[ $? -eq 0 ] && echo "Nginx start is ok" || echo "Nginx start is failed"
else
/usr/sbin/nginx -s stop
[ $? -eq 0 ] && echo "Nginx stop is ok" || echo "Nginx stop is failed"
sleep 2
/usr/sbin/nginx
fun
fi
;;
status)
netstat -lntup|grep ":80\b" &>/dev/null
if [ $? -eq 0 ]
then
echo "Nginx is runing ..."
else
echo "Nginx is not runing ..."
fi
;;
*)
echo "Usage: $0 {start|stop|status|restart|reload}"
exit 2
esac
4、编写简易跳板机脚本
# 储备知识
Linux中断信号区别为:键入不同、对应操作不同、启用不同
1、HUP中断信号:HUP中断信号的对应操作为让进程挂起,睡眠,同<Ctrl+X>
2、INT中断信号:INT中断信号的对应操作为正常关闭所有进程,同<Ctrl+C>
3、TERM中断信号 15:TERM中断信号的对应操作为正常的退出进程
4、KILL中断信号 9:KILL中断信号的对应操作为强制关闭进程
5、STOP 19暂停(同 Ctrl + Z)
6、CONT 18继续(与STOP相反, fg/bg命令)
7、TSTP中断信号:TSTP中断信号的对应操作为暂时停用进程
1.简单示例
[root@egon shell]# vim jumpserver.sh
#!/bin/bash
cat<<EOF
1. BACKUP 10.0.0.41
2. WEB02 192.168.12.21
3. WEB03 10.0.0.9
EOF
trap "echo 不要乱按键盘,否则服务器将会爆炸" HUP INT TSTP
while true
do
read -p "请输入连接主机编号信息: " num
read -p "请输入账号: " user
# read -p "请输入要执行的命令: " cmd
case $num in
1)
ssh $user@10.0.0.41
[ $? -ne 0 ] && echo "connect faild"
;;
2)
ssh $user@192.168.12.21
[ $? -ne 0 ] && echo "connect faild"
;;
*)
echo "请输入连接主机信息"
esac
done
2.编写建议跳板机脚本
[root@m01 shell]# cat jumpserver.sh
#!/bin/bash
#jumpserver
web01=172.16.1.7
web02=172.16.1.8
db01=172.16.1.51
menu(){
cat <<EOF
--------------
|1.web01 |
|2.web02 |
|3.db01 |
|h:清屏 |
|q:退出 |
--------------
EOF
}
#菜单函数,控制不让输入ctrl+c强制退出
menu
trap "echo ·······不要乱按,否则会爆炸!" HUP INT TSTP
while true
do
read -p "请输入要连接主机编号>>>" num
case $num in
1)
ssh root@$web01
;;
2)
ssh root@$web02
;;
h)
clear
menu
;;
q)
break
;;
esac
done
3.执行效果
[root@m01 shell]# sh jumpserver.sh
--------------
|1.web01 |
|2.web02 |
|3.db01 |
|h:清屏 |
|q:退出 |
--------------
请输入要连接主机编号>>>
5、编写升级版跳板机脚本
1.编写跳板机脚本
[root@m01 shell]# cat /root/product/jump.sh
#!/bin/bash
#jumpserver
web01=172.16.1.7
web02=172.16.1.8
db01=172.16.1.51
db02=172.16.1.52
nfs=172.16.1.31
backup=172.16.1.41
lb01=172.16.1.5
lb02=172.16.1.6
zabbix=172.16.1.71
menu(){
cat <<-EOF
+-------------------------+
| 1) web01 天 宝 |
| 2) web02 王 塔 |
| 3) db01 盖 镇 |
| 4) db02 地 河 |
| 5) nfs 虎 妖 |
| 6) backup |
| 7) lb01 |
| 8) lb02 |
| 9) zabbix |
| h) help |
+-------------------------+
EOF
}
#菜单函数
menu
#控制不让输入ctrl+c,z
trap "" HUP INT TSTP
while true
do
read -p "请输入要连接的主机编号:" num
case $num in
1)
ssh root@$web01
;;
2)
ssh root@$web02
;;
3)
ssh root@$db01
;;
4)
ssh root@$db02
;;
5)
ssh root@$nfs
;;
6)
ssh root@$backup
;;
7)
ssh root@$lb01
;;
8)
ssh root@$lb02
;;
9)
ssh root@$zabbix
;;
h)
clear
menu
;;
q)
break
;;
esac
done
2.测试跳板机
[root@m01 shell]# sh /root/product/jump.sh
+-------------------------+
| 1) web01 天 宝 |
| 2) web02 王 塔 |
| 3) db01 盖 镇 |
| 4) db02 地 河 |
| 5) nfs 虎 妖 |
| 6) backup |
| 7) lb01 |
| 8) lb02 |
| 9) zabbix |
| h) help |
+-------------------------+
请输入要连接的主机编号:
流程控制之select语句
一、语法
select表达式是bash的一种扩展应用,擅长于交互式场合,用户可以从一组不同的值中进行选择
select var in ...
do
...
break
done
二、案例
1、select简单输出+选择
1.编写脚本
[root@egon /]# cat select.sh
#!/bin/bash
PS3='choose one: ' # select默认使用PS3变量的值做提示符
echo
select var in {A..D}
do
echo
echo "your choose is $var"
echo "OK"
echo
break # 跳出select,否则是死循环
done
2.执行脚本
[root@egon /]# ./select.sh
1) A
2) B
3) C
4) D
choose one: 3
your choose is C
OK
2、省略 脚本内的in list
若省略 in list ,即select var in {A..D}里面的 in {A..D},也就是脚本内指定的变量内容;
则select会把 $@ 当做列表项,在命令行尾自己指定变量内容,脚本会自动调用;
1.编写脚本:
[root@egon /]# cat select.sh
#!/bin/bash
PS3='choose one: ' # select默认使用PS3变量的值做提示符
echo
select var
do
echo
echo "your choose is $var"
echo "OK"
echo
break # 跳出select,否则是死循环
done
2.执行脚本,命令尾部自定义变量内容
[root@egon /]# ./select.sh 苹果 梨 蔬菜 香蕉 茄子
1) 苹果
2) 梨
3) 蔬菜
4) 香蕉
5) 茄子
choose one: 1
your choose is 苹果
OK

浙公网安备 33010602011771号