Shell 编程-Shell 分支结构你学会了吗?

今天给伙伴们分享一下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

如果对伙伴们有帮助,感谢关注支持「想吃西红柿」「云原生运维实战派」后续会有更多实用的运维技术分享给伙伴们,您的关注就是我最大的成就。

猜你喜欢

转载自blog.csdn.net/mohuanfenghuang/article/details/143137892