shell编程之case语句

shell编程之case语句

1.case语句的用途用语法

case 结构条件句相当于多分支的if/elif/else条件句,但是它比这些条件语句看起来更规范工整,常被用于实现系统服务启动脚本等企业

case语法
case 变量名 in
    值1)
        指令1
        ;;
    值2)
        指令2
        ;;
    值3)
        指令3
        ;;
    *)
        指令1
esac

1.1 case结构条件语句的执行流程

1.2 case语句的使用总结

1.case语句与if条件句的适用性
case语句比较适合变量值较少且为固定的数字或字符串集合情况(非不确定的内容,例如范围),如果变量的值是已知固定的start/stop/restart等元素,那么采用case语实现就比较适合
2.case语知与if语句的常见应用场景
case主要是写服务的启动脚本,一般情况下,传参不同且具有少量的字符串,其适用范围窄
if就是取值判断、比较、应用比case更广。几乎所有的case语句都可以用if条件语句实现
3.case语句的优势与特点
case语句就相当于多分支的if/elif/else语句,但case语句的优势是更规范、易读

1.3 case语句案例

1.3.1 执行shell脚本,打印一个如下的水果菜单:

1.apple
2.pear
3.banana
4.cherry
当用户输入对应的数字选择水果的时候,告诉他选择的水果是什么,并给水果单词加上一种颜色(随意),要求用case语句实现。
[root@ci-node1 scripts]# cat 14.sh 
#!/bin/bash
##############################################################
# File Name: 14.sh
# Version: V1.0
# Author: liu
# Organization: 
# Created Time : 2019-04-13 11:41:33
# Description:
##############################################################
cat <<EOF
    1.apple
    2.pear
    3.banana
    4.cherry
EOF
read -p "请输入您的选择:" num
red="33[31m"
green="33[32m"
yewllo="33[33m"
blue="33[34m"
tailer="33[0m"
case $num in
    1)
        echo -e "$red apple $tailer"
        ;;
    2)
        echo -e "$green pear $tailer"  
        ;;
    3)
        echo -e "$yewllo banana $tailer" 
        ;;
    4)
        echo -e "$blue cherry $tailer"
        ;;
    *)
        echo "Usage:$0{1|2|3|4}"
        exit 1
esac

1.3.2 利用case语句开发Rsync服务启动停止脚本,本例采用case语句以及新的思路来实现

[root@ci-node1 scripts]# cat rsync.sh 
#!/bin/bash
##############################################################
# File Name: rsync.sh
# Version: V1.0
# Author: liu
# Organization: 
# Created Time : 2019-04-13 12:13:32
# 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

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

原文地址:https://www.cnblogs.com/yjiu1990/p/10748227.html