shell-case语句

case语句

case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。

## 语法:
case 变量 in
	动作1|动作3|动作4)
		cmd1
		;;
	动作2)
		cmd2
	*)
		echo '脚本的用法'
		;;
esac

case会将变量和动作进行判断
可以进行多动作判断,使用   '|'  或

给shell加颜色

## 固定格式
\e[1;31mzls\e[0m


red_start='\e[1;31m'
red_end='\e[0m'

$red_start xxx $red_end

echo -e '\e[1;31mzls\e[0m'

[root@m01 ~]# echo -e '\e[5;32;41m zls \e[0m'

\e \033 \E
字体型号;字体颜色;背景颜色m

## 字体型号:
0:正常字体
1:字体加粗
2:字体变浅
3:字体斜体
4:字体下划线
5:字体闪烁

## 字体颜色
30m:黑色
31m:红色
32m:绿色
33m:黄色
34m:蓝色
35m:紫色
36m:天蓝
37m:白色

## 背景颜色
40m:黑色
41m:红色
42m:绿色
43m:黄色
44m:蓝色
45m:紫色
46m:天蓝
47m:白色

跳板机

1.判断指定的ip是否可以连接 2.判断退出密码 3.推送秘钥对

方式一

#!/bin/bash
signal(){
  trap '' INI QUIT TSTP TERM HUP
}

ssh_key(){
. /etc/init.d/functions
ls -l ~/.ssh/id_rsa &>/dev/null || ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
for n in 5 6 7 8 9 31 41 51 71;do
   sshpass -p wsh112233 ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@10.0.0.$n &>/dev/null && \
   action "10.0.0.$n send public key " /bin/true || \
   action "10.0.0.$n send public key " /bin/false
done
}

list_host(){
        cat <<EOF
        +------------------------+
        | 1 172.16.1.7 web01     |
        +------------------------+
        | 2 172.16.1.8 web02     |
        +------------------------+
        | 3 172.16.1.31 nfs      |
        +------------------------+
        | 4 172.16.1.41 backup   |
        +------------------------+
        | 5 172.16.1.51 db01     |
        +------------------------+
        | 6 172.16.1.52 db02     |
        +------------------------+
        | 7 172.16.1.71 zabbix   |
        +------------------------+
        | 输入 h 查看帮助菜单    |
        +------------------------+
        | 按 q 退出程序          |
        +------------------------+
EOF
}
exit_pass(){
read -p '请输入密码:' pass
while true;do
if [ $pass == 123 ];then
   exit
else
  main
fi
done
}
host_ip(){
  case $host in
    1|172.16.1.7|web01)
      echo '连接 172.1.16.7 web01'
      ssh 172.16.1.7
      ;;
    2|172.16.1.8|web02)
      echo '连接 172.16.1.8 web02'
      ssh 172.16.1.7
      ;;
    3|172.16.1.31|nfs)
      echo '连接 172.16.1.31 nfs'
      ssh 172.16.1.31
      ;;
    4|172.16.1.41|backup)
      echo '连接 172.16.1.41 backup'
      ssh 172.16.1.41
      ;;
    5|172.16.1.51|db01)
      echo '连接 172.16.1.51 db01'
      ssh 172.16.1.51
      ;;
    6|172.16.1.52|db02)
      echo '连接 172.16.1.52 db02'
      ssh 172.16.1.52
      ;;
    7|172.16.1.71|zabbix)
      echo '连接 172.16.1.71 zabbix'
      ssh 172.16.1.71
      ;;
    h)
      clear
      list_host
      ;;
    q)
      exit_pass
      ;;
    *)
      echo "Usage: $0 请输入主机名或IP或菜单编号...."
 esac
}

ssh_key
main(){
while true;do
  signal
  list_host
 read -p '请输入需要连接的主机:' host
  host_ip
done
}
main

方式二

#!/bin/bash

menu(){
cat <<EOF
+------------------------+
| 1 172.16.1.7 web01     |
+------------------------+
| 2 172.16.1.8 web02     |
+------------------------+
| 3 172.16.1.31 nfs      |
+------------------------+
| 4 172.16.1.41 backup   |
+------------------------+
| 5 172.16.1.51 db01     |
+------------------------+
| 6 172.16.1.52 db02     |
+------------------------+
| 7 172.16.1.53 db03     |
+------------------------+
| 8 172.16.1.54 db04     |
+------------------------+
| 9 172.16.1.61 m01      |
+------------------------+
| 10 172.16.1.71 zabbix  |
+------------------------+
| 输入 h 查看帮助菜单    |
+------------------------+
| 按 q 退出程序          |
+------------------------+
EOF
}

menu

trap "" HUP INT TSTP
while true;do
read -p '请输入需要连接的主机:' host



	case $host in
		1|172.16.1.7|web01)
			echo '连接 172.16.1.7 web01'
			;;
		2|172.16.1.8|web02)
			echo '连接 172.16.1.8 web02'
			;;
		3|172.16.1.31|nfs)
			echo '连接 172.16.1.31 nfs'
			;;
		h)
			clear
			menu
			;;
		q)
			exit
			;;
		*)
			echo "Usage: $0 请输入主机名或者IP或者菜单编号..."
	esac
done