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
posted @ 2022-06-09 18:19  秋风お亦冷  阅读(46)  评论(0)    收藏  举报