今天给伙伴们分享一下Shell 编程-Shell 分支结构,希望看了有所收获。
我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维的路上得到支持和共同进步!
如果伙伴们看了文档觉得有用,欢迎大家关注我的公众号,获取相关文档。爱运维,爱生活。
一、Shell 分支if语句
1、单分支 IF 条件语句
1、语法格式
if [ 条件判断式 ];then
条件成立时,执行的程序
fi
# if语句使用fi结尾和一般语言使用大括号结尾不同
# [条件判断式] 就是使用test命令判断,所以中括号和条件判断式之间必须有空格
# then 后面跟符号条件之后执行的程序,可以放在[]之后,用";"分割。也可以换行写入,就不需要";"了
2、实例
# 判断登录的用户是否为root
#!/bin/bash
# 把当前用户名赋值给变量test
test=$(env | grep "USER" | cut -d "=" -f 2)
if [ "$test" == "root" ];then
echo "current user is root"
fi
# 判断分区使用率
#!/bin/bash
test=$(df -h | grep sda5 | awk '{print $5}' | cut -d "%" -f 1)
# 把分区使用率作为变量值赋予变量 test
if [ $test -ge 90 ];then
echo "文件满了"
fi
2、双分支语句
1、语法格式
if [ 条件判断式 ];then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
如果
就/则
干什么事
否则
做另外的事
结束
2、实例
# 判断输入的是不是目录
#!/bin/bash
read -t 30 -p "please input a dir :" dir
if [ -d $dir ];then # 注意前后的空格
echo "输入的是目录"
else
echo "输入的不是目录"
fi
# 判断 apache 是否启动
#!/bin/bash
test1 = $(ps aux | grep httpd | grep -v grep) ps aux | grep [h]ttpd
# 截取httpd进程,并把结果赋予变量test
if [ -n $test1 ];then
# 如果test不为空
echo "the apache is on running!" >> /~/running.log
else
/etc/rc.d/init.d/httpd start &> dev/null
echo "the apache is restart!" >> /~/restart.log
fi
3、多分支语句
1、语法格式
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
...省略更多条件....
else
当所有条件都不成立,最后执行此程序
fi
如果(if) 条件一满足
做条件一的工作
如果(elif) 条件二满足
做条件二的工作
如果(elif) 条件三满足
做条件三的工作
上面的条都不满足 (兜底)
做 else 的工作
结束标识
2、实例
#!/bin/bash
# 从键盘输入获取数字赋值给变量age
read -p '请输入你的年龄:' age
if (( $age <= 2 )); then
echo "婴儿"
elif (( $age >= 3 && $age <= 8 )); then
echo "幼儿"
elif (( $age >= 9 && $age <= 17 )); then
echo "少年"
elif (( $age >= 18 && $age <=25 )); then
echo "青年"
elif (( $age >= 26 && $age <= 40 )); then
echo "中年"
elif (( $age >= 41 && $age <= 60 )); then
echo "中老年"
else
echo "老年"
fi
70 预警 低 发信息 提示 通知运维
80 告警 中 发信息,邮件 运维 研发
90 告警 严重 电话 运维 领导 研发 领导
二、Shell 分支case语句
- case 语句和 if…elif…else 语句一样都是多分支条件语句,不过和多分支 if 条件语句不同的是,case 语句只能判断一种条件关系,而 if 语句可以判断多种条件关系。
1、case 语法格式
case 变量名 in
值1)
如果变量的值等于值1则执行指令1
;;
值2)
如果变量的值等于值2则执行指令2
;;
值3)
如果变量的值等于值3则执行指令3
;;
*)
如果变量的值不等于以上列出的任何值则执行默认指令
esac
2、case 语句的使用总结
-
case 语句比较适合变量值较少且为固定的数字或字符串集合情况(非不确定的内容,例如范围),如果变量的值是已知固定的start/stop/restart等元素,那么采用case语实现就比较适合
-
case主要是写服务的启动脚本,一般情况下,传参不同且具有少量的字符串,其适用范围窄
-
if就是取值判断、比较、应用比case更广。几乎所有的case语句都可以用if条件语句实现
-
case语句就相当于多分支的if/elif/else语句,但case语句的优势是更规范、易
3、case 语句案例
1、判断输入内容
1.apple
2.pear
3.banana
4.cherry
# 当用户输入对应的数字选择水果的时候,告诉他选择的水果是什么,并给水果单词加上一种颜色(随意),要求用case语句实现。
[[email protected] ~]# cat fruit.sh
#!/bin/bash
##############################################################
# File Name: fruit.sh
# Version: V1.0
# Author: edenluo
# Organization:
# Created Time :
# Description: case 语句示例
##############################################################
cat <<EOF
1.apple
2.pear
3.banana
4.cherry
EOF
read -p "请输入您的选择:" num
red="\033[31m"
green="\033[32m"
yellow="\033[33m"
blue="\033[34m"
tailer="\033[1m"
case $num in
1)
echo -e "$red apple $tailer"
;;
2)
echo -e "$green pear $tailer"
;;
3)
echo -e "$yellow banana $tailer"
;;
4)
echo -e "$blue cherry $tailer"
;;
*)
echo "Usage:$0 {1|2|3|4}"
exit 1
esac
[[email protected] ~]# cat fruit.sh
#!/bin/bash
##############################################################
# File Name: fruit.sh
# Version: V1.0
# Author: edenluo
# Organization:
# Created Time :
# Description: install nginx
##############################################################
cat <<EOF
*******************
* 1.apple *
* 2.pear *
* 3.banana *
* 4.cherry *
*******************
EOF
read -p "请输入您的选择:" num
case $num in
1)
printf "\e[1;31m# q: Back to top menu #\e[0m\n"
;;
2)
printf "\e[1;32m# q: Back to top menu #\e[0m\n"
;;
3)
printf "\e[1;33m# q: Back to top menu #\e[0m\n"
;;
4)
printf "\e[1;34m# q: Back to top menu #\e[0m\n"
;;
*)
echo "Usage:$0 {1|2|3|4}"
exit 1
esac
2、shell 字体颜色设置
SHELL:echo -e "\033[字背景颜色;字体颜色m字符串\033[0m"
格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m"
例如:
echo -e "\033[41;36m something here \033[0m"
其中41的位置代表底色, 36的位置是代表字的颜色
那些ascii code 是对颜色调用的始末.
\033[ ; m …… \033[0m
字背景颜色范围:40----49
40:黑
41:深红
42:绿
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色
字颜色:30-----------39
30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色
======================ANSI控制码的说明 =========================
\33[0m 关闭所有属性
\33[1m 设置高亮度
\33[4m 下划线
\33[5m 闪烁
\33[7m 反显
\33[8m 消隐
\33[30m -- \33[37m 设置前景色
\33[40m -- \33[47m 设置背景色
\33[nA 光标上移n行
\33[nB 光标下移n行
\33[nC 光标右移n行
\33[nD 光标左移n行
\33[y;xH设置光标位置
\33[2J 清屏
\33[K 清除从光标到行尾的内容
\33[s 保存光标位置
\33[u 恢复光标位置
\33[?25l 隐藏光标
\33[?25h 显示光标
3、判断输入执行输入指令
[[email protected] ~]# cat rsync.sh
#!/bin/bash
##############################################################
# File Name: rsync.sh
# Version: V1.0
# Author: edenluo
# Organization:
# Created Time :
# Description:
##############################################################
. /etc/init.d/functions
# rsyncd进程号路径
rsyncd_pid_path=/var/run/rsyncd.pid
# 创建锁文件
lockfile=/var/lock/subsys/rsyncd
start() {
if [ ! -f $rsyncd_pid_path ]
then
rsync --daemon
retval=$?
if [ $retval -eq 0 ]
then
action "rsync is start ok" /bin/true
touch $lockfile
return $retval
else
action "rsync is start fail" /bin/false
return $retval
fi
else
echo "rsync in runing.."
fi
}
stop() {
if [ -f $rsyncd_pid_path ]
then
rsyncd_pid=`cat $rsyncd_pid_path`
#判断进程是否存在
if (kill -0 $rsyncd_pid &>/dev/null)
then
kill $rsyncd_pid
retval=$?
if [ $retval -eq 0 ]
then
action "rsync is stop ok" /bin/true
rm -f $lockfile
return $retval
else
action "rsync stop fail" /bin/false
return $retval
fi
fi
else
echo "$rsyncd_pid_path is not exist or rsyncd does not startup"
fi
}
case $1 in
start)
start
retval=$?
;;
stop)
stop
retval=$?
;;
restart)
stop
retval=$?
sleep 1
start
retval=$?
;;
*)
echo "Usage:$0{start|stop|restart}"
exit 1
esac
exit $retval
如果对伙伴们有帮助,感谢关注支持「想吃西红柿」「云原生运维实战派」后续会有更多实用的运维技术分享给伙伴们,您的关注就是我最大的成就。