文章目录

  • ​​1.case语法结构​​
  • ​​2.case实现jump Server​​
  • ​​3.case实现简单的系统工具箱​​

1.case语法结构

  • 模式匹配case
  • 语法结构,相当于if。。。。。。elif。。。。else。。。。
    case语句是从上往下执行的
case 变量 in
模式1)
命令序列
;;
模式1)
命令序列
;;
模式1)
命令序列
;;
*)
无匹配后命令序列
esac
  • eg:
#!/usr/bin/bash
#yum config case
yum_server=10.8.40.100
os_vrsion=`cat /etc/redhat-release|awk '{print $4}' \
|awk -F"." '{print $1"."$2}'`

[-d /etc/yum.repos.d] || mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.d /etc/yum.repos.d/bak &>/dev/null

case "$os_version" in ##变量的值去匹配哪个,字符串匹配
7.3)## "7.3"也可以
cat >/etc/yum.repos.d/centos7u3.repo<<-EOF
[centos7u3]
name=centos7u3
baseurl=ftp://$yum_server/centos7u3
gpgcheck=0
EOF
echo "7.3 yum configure.."
;;
6.8)
curl -o /etc/yum.repos.d/centos6u8.repo ftp://$yum_server/centos6u8.repo
;;
5.9)
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirros.aliyun.com/repo/Cetos-5.repo
;;
*)
echo "error"
esac

执行:
sh -n yumconfig.sh
  • eg:删除用户的脚本
#!/usr/bin/bash
#delete user
#v1.0 by jiwang 2020-2-17
read -p "input a username: " user

id $user &>/dev/null
if [ $? -ne 0 ];then
echo "no such user: $user"
exit 1 ##这里的1随便定义
fi

read -p "Are you sure?[y/n]: " action
if [ "${action}" == "y" -o "${action}" == "Y" ];then
userdel -r $user
echo "$user is deleted"
else
echo "good!"
exit 2
fi
===================================================================================

#!/usr/bin/bash
#delete user
#v1.0 by jiwang 2020-2-17
read -p "input a username: " user

id $user &>/dev/null
if [ $? -ne 0 ];then
echo "no such user: $user"
exit 1 ##这里的1随便定义
fi

read -p "Are you sure?[y/n]: " action
case "$action" in
y|Y|yes)
userdel -r $user
echo "$user is deleted"
;;
*)
echo "error"
esac
  • command命令:可以判断后面的命令是不是命令
#!/usr/bin/bash

command1=/bin/date
if command -v $command &>/dev/null;then
:
else
yum -y install ..
fi

是命令的话,啥都不做,可以用:表示,:就是true

2.case实现jump Server

  • 要求:只对跳板机提供远程连接端口,shell脚本的大致框架如下:
    (1)打开个菜单
    (2)echo和read加个提示
    (3)判断变量的值
  • eg代码如下:从跳板机到后面的机器采用密码验证登录
在三个服务器上,分别临时修改主机名:hostname web1      hostname web2     hostname mysql1
在三个服务器和跳板机上,分别增加用户名:
useradd alice
passwd alice
su - alice
===================================================================================
在跳板机上操作:
vim jumpserver.sh

#!/usr/bin/bash
#jumpserver
web1=192.168.122.241
web2=192.168.122.52
mysql=192.168.122.210
clear
while :
do
#打印
cat <<-EOF
1. web1
2. web2
3. mysql1
EOF

read -p "input number: " num
case "$num" in
1)
ssh alice@$web1
;;
2)
ssh alice@$web2
;;
3)
ssh alice@$mysql1
;;
"") ##啥也不干,'')也行
echo "error"
esac
done
  • eg:eg代码如下:从跳板机到后面的机器采用密钥验证登录
以alice为主机名进行操作:
ssh-keygen
全都输入空格,产生公钥和私钥
ll .ssh/
ssh-copy-id 192.168.122.52
ssh-copy-id 192.168.122.210
ssh-copy-id 192.168.122.241

执行上面脚本:
sh jumpserver.sh
  • 从远程10.18.42.101登录到跳板机,执行的结果如下:
  • 在跳板机上,将该jumpserver.sh脚本的绝对路径放到.bash_profile中,使得脚本自启动
  • trap捕捉信号,继续上面的eg去写
##trap捕捉信号,没有做什么操作,防止脚本退出,使得crl C没用
#!/usr/bin/bash
#jumpserver
trap "" HUP INT OUIT TSTP
web1=192.168.122.241
web2=192.168.122.52
mysql=192.168.122.210
。。。。。
。。。。。。
  • echo打印有颜色的字体时,是换行的,-n参数可以不换行,继续上面的eg去写
。。。
EOF

echo -en "\e[1;32minput number: \e[0m"
read num

case 。。。。
。。。

3.case实现简单的系统工具箱

  • 工具箱类似如下:
  • eg:前面的大端提示打印的话,用cat或者echo或者printf去打印
vim system_manager.sh

#!/usr/bin/bash
#system manager
#v1.0 by jiwang 2020-2-18

##函数为了能重复的调用
menu()
{
cat <<-EOF
################################
# h. help
# f. disk partition
# d. filesysytem mount
# m. memory
# u. sysytem load
# q. exit
################################
EOF
}

menu
while : ##死循环 while [ 1 == 1 ] 或者 while true
do
read -p "Please input[h for help]: " action
##接着做模式匹配
case "$action" in
h)
clear
menu
;;
f)
fdisk -l
;;
d)
df -Th
;;
m)
free -m ##按Mbit显示
;;
u)
uptime
;;
q)
exit ##exit跳出程序。。。。。。break跳出循环
;;
"") ##输入为空
;;
*)
echo "error"
esac
done
echo "finish...."###使用break会执行