shell - case 流程控制
Posted afrafre
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell - case 流程控制相关的知识,希望对你有一定的参考价值。
case 实现程序流程的选择,循环
# 服务的脚本启动和停止 ---- case 的应用场景
case variables in
variables 1)
order 1;;
variables 2)
order 2;;
variables 3)
order 3;;
*)
no matches
esac
# 注意 if不能同时判断用户输入为 1 或者是 backup
# 使用case 判断用户输入,注意结尾用 ;;
#!/usr/bin/bash
cat <<eof
####################
1. backup
2. copy
3. quit
####################
eof
read -p "please enter [1|2|3]:" re
case $re in
1|backup) # 这里可以同时判断输入的是1还是backup , 区别于if 判断
echo "backup";;
2|copy)
echo "copy";;
3|quit)
echo "quit" && exit;;
*)
echo "attention your input!!!"
echo "USAGE: $0 1|2|3"
esac
一个rsync 的启动和停止的脚本
# 注意脚本名 不能用rsync , 这样取进程号的时候才不会取出多个
1. 如何启动命令 rsync --daemon
ps aux|grep rsync|grep -v grep
2. 如何停止 pkill rsync
# $$ 当前脚本运行时的进程号
source /etc/init.d/functions
# 传入第一个参数
rs=$1
if [ $rs == 'start' ];then
if [ ! -f /var/run/rsync.pid ];then
touch /var/run/rsync.pid
rsync --daemon
# 注意使用action ,true 为绿色,false为红色
action 'rsync is starting' /bin/true
else
action 'rsync already started' /bin/false
fi
elif [ $rs == 'stop' ];then
if [ ! -f /var/run/rsync.pid ];then
action 'async is already stopped' /bin/false
else
rm -f /var/run/rsync.pid
pkill rsync
action 'rsync is stopping' /bin/true
fi
elif [ $rs == 'status' ];then
if [ ! -f /var/run/rsync.pid ];then
echo 'Rsync service status inactive'
else
echo $$
rsync_pid=$$
rsync_status=$(ps aux|grep rsync|grep -v grep|grep -v $rsync_pid|awk 'print $2')
echo 'rsync service status active $rsync_status'
fi
else
echo 'USAGE: $0 start|stop'
exit
fi
###################### 使用case 来完成服务的启动和停止 ################################
#!/usr/bin/bash
source /etc/init.d/functions
rs=$1
case $rs in
start)
#先判断文件是否存在
if [ ! -f /var/run/rsync.pid ];then
touch /var/run/rsync.pid
rsync --daemon
action "rsync starting..." /bin/true
else
action "rsync already started" /bin/false
fi
;;
stop)
# 文件如果不存在已经停了
if [ ! -f /var/run/rsync.pid ];then
action "rsync is already stopped" /bin/false
else
action "rsync is stopping" /bin/true
rm -f /var/run/rsync.pid
pkill rsync
fi
;;
status)
echo "enter status"
# 判断文件存在的话输出pid
if [ ! -f /var/run/rsync.pid ];then
echo " rsync service status inactive"
else
Rsync_status=$(ps aux|grep rsync|grep -v grep|awk 'print $2')
# 注意 不能单引号套双引号,这样$Rsync_status 原样输出
echo "rsync service status active '$Rsync_status' "
fi
;;
*)
echo "USAGE $0 start|stop|status"
exit
esac
nginx 启动和停止脚本
# 如何启动 /usr/sbin/nginx
# 如何停止 /usr/sbin/nginx -s stop
# 如何重载 /usr/sbin/nginx -s reload
#!/usr/bin/bash
source /etc/init.d/functions
# 要加锁,脚本运行过程中不能重复执行
if [ -f /tmp/nginx.lock ];then
echo "脚本正在运行,请稍后"
exit
fi
touch /tmp/nginx.lock
# 开始正文
rs=$1
case $rs in
start)
if [ -f /var/run/nginx.pid ];then
action " already started" /bin/false
exit
else
/usr/sbin/nginx
action " start successfully" /bin/true
fi
;;
stop)
if [ -f /var/run/nginx.pid ];then
/usr/sbin/nginx -s stop
if [ $? -eq 0 ];then
action "stop successfully" /bin/true
else
action "stop failed" /bin/false
fi
else
action "already stopped" /bin/false
fi
;;
reload)
# 如果文件存在,可以重载
if [ -f /var/run/nginx.pid ];then
/usr/sbin/nginx -s reload
if [ $? -eq 0 ];then
action "reload successly" /bin/true
else
action " reload failded" /bin/false
fi
exit
else
action " service already stopped" /bin/false
fi
;;
status)
if [ -f /var/run/nginx.pid ];then
nginx_pid=$(cat /var/run/nginx.pid)
echo "nginx $nginx_pid is running"
else
echo "nginx is not running "
fi
;;
*)
echo "USAGE: $0 [ start | stop | relaod | status ] "
esac
# 脚本运行结束后解锁
rm -f /tmp/nginx.lock
########################################### 修改版#######################################
#!/usr/bin/bash
source /etc/init.d/functions
# 要加锁,脚本运行过程中不能重复执行
if [ -f /tmp/nginx.lock ];then
echo "脚本正在运行,请稍后"
exit
fi
touch /tmp/nginx.lock
rs=$1
case $rs in
start)
if [ -f /var/run/nginx.pid ];then
action " already started" /bin/false
exit
else
/usr/sbin/nginx
action " start successfully" /bin/true
fi
rm -f /tmp/nginx.lock
;;
stop)
if [ -f /var/run/nginx.pid ];then
/usr/sbin/nginx -s stop
if [ $? -eq 0 ];then
action "stop successfully" /bin/true
else
action "stop failed" /bin/false
fi
else
action "already stopped" /bin/false
fi
rm -f /tmp/nginx.lock
;;
reload)
# 如果文件存在,可以重载
if [ -f /var/run/nginx.pid ];then
# 判断命令是否执行有错,如果有错取出错误的行
/usr/sbin/nginx -t &>/dev/null
if [ $? -eq 0 ];then
/usr/sbin/nginx -s reload
if [ $? -eq 0 ];then
action "reload successly" /bin/true
else
action " reload failded" /bin/false
fi
else
/usr/sbin/nginx -t &>err.txt
nginx_conf=$(awk -F "[: ]" 'NR==1 print $(NF-1)' err.txt)
nginx_line=$(awk -F "[: ]" 'NR==1 print $(NF)' err.txt)
reap -p "是否进入配置文件进行修改?" re
case $re in
y|yes|YES)
vim +$nginx_line $nginx_conf
;;
n|no|NO)
echo "modify manully"
exit
;;
*)
echo "USAGE: $0 y|n"
esac
fi
exit
else
action " service already stopped" /bin/false
fi
rm -f /tmp/nginx.lcok
;;
status)
if [ -f /var/run/nginx.pid ];then
nginx_pid=$(cat /var/run/nginx.pid)
echo "nginx $nginx_pid is running"
else
echo "nginx is not running "
fi
rm -f /tmp/nginx.lock
;;
*)
echo "USAGE: $0 [ start | stop | relaod | status ] "
esac
# 脚本运行结束后解锁
rm -f /tmp/nginx.lock
系统管理工具箱
case 实行简单的JumpServer
1. 执行脚本后,需要看到所有能管理的主机
2. 选择菜单,提示输入连接某个主机
#!/usr/bin/bash
# 定义一个函数可以调用多次
meminfo()
cat <<-EOF
******************
1. lb01-172.16.1.5
2. lb02-172.16.1.6
3. web01-172.16.1.8
h. help
******************
EOF
meminfo
trap "" HUP INT TSTP # ctrl c v不起作用
read -p "please enter the number you want: " connection
case $connection in
1)
ssh root@lb01-172.16.1.5
;;
2)
ssh root@lb02-172.16.1.6
;;
3)
ssh root@web01-172.16.1.8
;;
h)
clear
meminfo
;;
*)
echo "USAGE: $0 输入 1,2,3,h"
esac
'''
可以加死循环,保证程序连接后端服务,退出后还能选择主机
可以将脚本加入到 /etc/bashrc中,用户一连接,就自动运行该脚本
'''
命令总结:
# 创建用户
useradd octivia
# 设置密码
echo "123"|passwd --stdin octivia
多级菜单
# 函数调用
#!/usr/bin/bash
installfunc()
cat <<-EOF
1. 安装nginx
2. 安装php
3. 退出
EOF
nginxfunc()
cat <<-EOF
1. 安装版本1
2. 安装版本2
3. 清屏
4. 返回上一页面
EOF
phpfunc()
cat <<-EOF
1. 安装版本一
2. 安装版本二
3. 退出
EOF
installfunc
read -p "请选择:" software
case $software in
1)
clear
nginxfunc
read -p "please choose version: " version
case $version in
1)
echo "install nginx version1"
;;
2)
echo "install nginx version2"
;;
3)
clear ;;
4)
installfunc
esac
;;
2)
phpfunc
read -p "please choose version: " version
case $version in
1)
echo "install php version1"
;;
2)
echo "install php version2"
;;
3)
installfunc
esac
;;
3)
exit
esac
以上是关于shell - case 流程控制的主要内容,如果未能解决你的问题,请参考以下文章