Shell case流程控制
case语句介绍
case … esac 为多选择语句,与其他语言中的 switch … case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。
可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
在某些时候,case要优于if,少写很多判断
语法
case 变量 in
)
comand
;;
)
comand
;;
esac
例:
case $1 in
start)
start_rsync
;;
stop)
stop_rsync
;;
restart)
restart_rsync
;;
*)
echo "Usage: $0 {start|stop|restart}"
esac
case练习
输入阿拉伯数字或者英文,输出中文大写数字
## if
num=$1
if [ $num == 1 -o $num == 'one' ];then
echo '壹'
elif [ $num == 2 -o $num == 'two' ];then
echo '贰'
elif [ $num == 3 -o $num == 'three' ];then
echo '叁'
elif [ $num == 4 -o $num == 'four' ];then
echo '肆'
elif [ $num == 5 -o $num == 'five' ];then
echo '伍'
elif [ $num == 6 -o $num == 'six' ];then
echo '陆'
elif [ $num == 7 -o $num == 'seven' ];then
echo '柒'
elif [ $num == 8 -o $num == 'eight' ];then
echo '捌'
elif [ $num == 9 -o $num == 'nine' ];then
echo '玖'
elif [ $num == 10 -o $num == 'ten' ];then
echo '拾'
else
echo '请输入1-10的数字'
fi
## case
num=$1
case $num in
1|one)
echo '壹'
;;
2|two)
echo '贰'
;;
3|three)
echo '叁'
;;
4|four)
echo '肆'
;;
5|five)
echo '伍'
;;
6|six)
echo '陆'
;;
7|seven)
echo '柒'
;;
8|eight)
echo '捌'
;;
9|nine)
echo '玖'
;;
10|ten)
echo '拾'
esac
## 接收多个参数
num=$*
for n in $num;do
case $n in
1|one)
echo '壹'
;;
2|two)
echo '贰'
;;
3|three)
echo '叁'
;;
4|four)
echo '肆'
;;
5|five)
echo '伍'
;;
6|six)
echo '陆'
;;
7|seven)
echo '柒'
;;
8|eight)
echo '捌'
;;
9|nine)
echo '玖'
;;
10|ten)
echo '拾'
;;
*)
echo "Usage: $0 {1..10} or {one..ten}"
esac
done
shwll中加颜色
加颜色固定格式
\e[条件 \e[条件
\033[1;31m \033[0m
\e[1;31m \e[0m
1:字体选项
31m:字体颜色
0m:背景颜色
echo -e '\e[1;31m 红色的zls \e[0m'
echo -e '\e[2;31m 红色的zls \e[0m'
echo -e '\e[2;31m 红色的yuzong \e[0m'
echo -e '\e[2;32m 红色的yuzong \e[0m'
echo -e '\e[2;33m 红色的yuzong \e[0m'
echo -e '\e[5;33m 红色的yuzong \e[0m'
echo -e '\e[1;5;33m 红色的yuzong \e[0m'
echo -e '\e[1;5;33m 红色的yuzong \e[31m'
echo -e '\e[1;5;33m 红色的yuzong \e[41m'
echo -e '\e[1;5;33m 红色的yuzong \e[42m'
echo -e '\e[1;5;33m;41m 红色的yuzong \e[0m'
echo -e '\e[1;5;41;33m 红色的yuzong \e[0m'
echo -e '\e[1;5;41;32m 红色的yuzong \e[0m'
echo -e '\e[1;5;42;32m 红色的yuzong \e[0m'
cat <<EOF
1.apple
2.pear
3.banana
4.cherry
5.orange
6.watermalon
7.grapes
EOF
read -p "请输入水果名或菜单编号: " name
case $name in
1|apple)
echo -e '\e[1;31m apple \e[0m'
;;
2|pear)
echo -e '\e[1;37m pear \e[0m'
;;
3|banana)
echo -e "\e[1;33m banana \e[0m"
;;
4|cherry)
echo -e "\e[1;31m cherry \e[0m"
;;
5|orange)
echo -e "\e[1;42;33m orange \e[0m"
;;
6|watermalon)
echo -e "\e[1;42;30m watermalon \e[0m"
;;
7|grapes)
echo -e "\e[1;35m grapes \e[0m"
;;
*)
echo "Usage: $0 看菜单"
esac
练习
用户可以哦输入任意字符串,根据菜单,給字符串加颜色
#!/bin/bash
cat <<EOF
1.red
2.green
3.blue
4.black
5.purple
6.yellow
7.white
8.lightblue
EOF
red="\e[1;31m"
green="\e[1;32m"
blue="\e[1;34m"
black="\e[1;30m"
purple="\e[1;35m"
yellow="\e[1;33m"
white="\e[1;37m"
ligthblue="\e[1;36m"
end="\e[0m"
read -p 'Please input string and color ' str color
case $color in
1|red)
echo -e "$red $str $end"
;;
2|green)
echo -e "$green $str $end"
;;
3|blue)
echo -e "$blue $str $end"
;;
4|black)
echo -e "$black $str $end"
;;
5|purple)
echo -e "$purple $str $end"
;;
6|yellow)
echo -e "$yellow $str $end"
;;
7|white)
echo -e "$white $str $end"
;;
8|lightblue)
echo -e "$lightblue $str $end"
;;
*)
echo "Usage: $0 没有该颜色"
esac
简易版跳板机
#!/bin/bash
. /etc/init.d/functions
lb01=10.0.0.5
lb02=10.0.0.6
web01=10.0.0.7
web02=10.0.0.8
web03=10.0.0.9
nfs=10.0.0.31
backup=10.0.0.41
db01=10.0.0.51
db02=10.0.0.52
db03=10.0.0.53
zabbix=10.0.0.71
m01=10.0.0.61
trap "" HUP INT TSTP
menu(){
cat <<EOF
1.lb01 $lb01
2.lb02 $lb02
3.web01 $web01
4.web02 $web02
5.web03 $web03
6.nfs $nfs
7.backup $backup
8.db01 $db01
9.db02 $db02
10.db03 $db03
11.zabbix $zabbix
12.m01 $m01
EOF
}
menu
while ture;do
read -p "请输入跳板机编号或主机名: " jump_ip
judge_ip(){
jump_ip3=$1
ping -c 1 -w 0.1 -i 0.1 $jump_ip3 &>/dev/null
if [ $? -eq 0 ];then
return 1
fi
}
ssh_key(){
jump_ip2=$1
if [ ! -f ~/.ssh/id_rsa.pub ];then
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
fi
judge_ip $jump_ip2
if [ ! -f ~/.ssh/id_rsa.pub ];then
sshpass -p $passwd ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.$n -o StrictHostKeyChecking=no &>/dev/null
else
retuirn 1
fi
}
ssh_judge(){
jump_ip4=$1
ssh_key $jump_ip4
if [ $? -ne 1 ];then
ssh $jump_ip4
else
action "$jump_ip4" /bin/false
fi
}
case $jump_ip in
1|lb01)
ssh_judge $lb01
;;
2|lb02)
ssh_judge $lb02
;;
3|web01)
ssh_judge $web01
;;
4|web02)
ssh_judge $web02
;;
5|web03)
ssh_judge $web03
;;
6|nfs)
ssh_judge $nfs
;;
7|backup)
ssh_judge $backup
;;
8|db01)
ssh_judge $db01
;;
9|db02)
ssh_judge $db02
;;
10|db03)
ssh_judge $db03
;;
11|zabbix)
ssh_judge $zabbix
;;
12|m01)
ssh_judge $m01
;;
close)
read -p -s "请输入退出密码: " pass
if [ $pass == '123' ];then
break
else
echo "密码错误"
fi
;;
h|help)
menu
;;
*)
echo "没有该主机"
esac
done