1. 程式人生 > >《Shell 程式設計》08_case 條件語句

《Shell 程式設計》08_case 條件語句

《Shell 程式設計》08_case 條件語句

標籤(空格分隔): Shell


文章目錄

8.1 case 條件語句的語法

case "變數" in
    值 1)
        指令 1...
        ;;
    值 2)
        指令 2...
        ;;
    *)
        指令 3
esac

8.2 case 條件語句實踐

例 8-1

執行 Shell 指令碼,列印一個如下的水果選單:
(1)apple
(2)pear
(3)banana
(4)cherry

當用戶輸入數字選擇水果時,告知選擇的水果並給水果單詞加上一種顏色。

給字型加顏色的命令為:

[[email protected] ~]# echo -e "\E[1;31m red color ylt\E[0m"
 red color ylt #<== 列印的字為紅色
[[email protected] ~]# echo -e "\033[1;31m red color ylt\033[0m"
 red color ylt

在上述命令中:

  • echo -e 可以識別轉義字元,這裡將識別特殊字元的含義,並輸出。
  • \E 可以使用 \033 替代。
  • “[1” 數字 1 表示加粗顯示(不同數字代表不同意思,詳細資訊 man console_codes )。
  • 31m 表示紅色字型,不同數字代表不同意思。
  • “red color ylt” 代表要設定的內容。
  • “[0m” 表示關閉所有屬性,不同數字代表不同意思。

有關 ANSI 控制碼說明如下:

  • \33[0m 表示關閉所有屬性。
  • \33[1m 表示設定高亮度。
  • \33[4m 表示下劃線。
  • \33[5m 表示閃爍。
  • \33[7m 表示反顯。
  • \33[8m 表示消隱。
  • \33[30m – \33[37m 表示設定前景色。
  • \33[40m – \33[47m 表示設定背景色。

開發指令碼:

[[email protected] scripts]# cat fruit.sh
#!/bin/bash
RED_COLOR='\E[1;31m'
GREEN_COLOR='\E[1;32m'
YELLOW_COLOR='\E[1;33m'
BLUE_COLOR='\E[1;34m'
RES='\E[0m'
function usage(){
        echo "USAGE: $0 {1|2|3|4}"
        exit 1
}
function menu(){
        cat <<END
        1. apple
        2. pear
        3. banana
END
}
function chose(){
        read -p "pls input your choice:" fruit
case "$fruit" in
        1)
                echo -e "${RED_COLOR}apple${RES}"
                ;;
        2)
                echo -e "${GREEN_COLOR}pear${RES}"
                ;;
        3)
                echo -e "${BLUE_COLOR}banana${RES}"
                ;;
        *)
                usage
esac
}
function main(){
        menu
        chose
}
main

例 8-2 開發給指定內容加指定顏色的指令碼

[[email protected] ~]# echo -e "033[1;30m black color\033[0m"
[[email protected] ~]# echo -e "\033[1;31m red color\033[0m"
[[email protected] ~]# echo -e "\033[1;32m green color\033[0m"
[[email protected] ~]# echo -e "\033[1;33m brown color\033[0m"
[[email protected] ~]# echo -e "\033[1;34m blue color\033[0m"
[[email protected] ~]# echo -e "\033[1;35m magenta color\033[0m"
[[email protected] ~]# echo -e "\033[1;36m cyan color\033[0m"
[[email protected] ~]# echo -e "\033[1;37m white color\033[0m"
[[email protected] scripts]# cat color.sh
#!/bin/bash
function Addcolor(){
        RED_COLOR='\E[1;31m'
        GREEN_COLOR='\E[1;32m'
        YELLOW_COLOR='\E[1;33m'
        BLUE_COLOR='\E[1;34m'
        PINK_COLOR='\E[1;35m'
        RES='\E[0m'
if [ $# -ne 2 ]; then
        echo "Usage: $0 content {red|yellow|blue|pink}"
        exit
fi
case "$2" in
        red|RED)
                echo -e "${RED_COLOR}$1${RES}"
                ;;
        green|GREEN)
                echo -e "${GREEN_COLOR}$1${RES}"
                ;;
        yellow|YELLOW)
                echo -e "${YELLOW_COLOR}$1${RES}"
                ;;
        blue|BLUE)
                echo -e "${BLUE_COLOR}$1${RES}"
                ;;
        pink|PINK)
                echo -e "${PINK_COLOR}$1${RES}"
                ;;
        *)
                echo "Usage: $0 content {red|yellow|blue|pink}"
                exit
esac
}
function main(){
        Addcolor $1 $2
}
main $*

例 8-3 給輸出的字串加背景顏色

echo -e "\033[40;37m 黑底白字 ylt\033[0m" 
echo -e "\033[41;37m 紅底白字 ylt\033[0m"
echo -e "\033[42;37m 綠底白字 ylt\033[0m"
echo -e "\033[43;37m 棕底白字 ylt\033[0m"
echo -e "\033[44;37m 藍底白字 ylt\033[0m"
echo -e "\033[45;37m 洋紅底白字 ylt\033[0m"
echo -e "\033[46;37m 藍綠底白字 ylt\033[0m"
echo -e "\033[47;30m 白底黑字 ylt\033[0m"

例 8-4 實現通過傳參的方式往 /etc/openvpn_authfile.conf 新增使用者:

1)命令用法為:

USAGE: sh adduser {-add|-del|-search} username

2)如果有同名的使用者,則不能新增,如果沒有對應使用者,則無需刪除,查詢到使用者或沒有使用者時應給出明確的提示。

3)/etc/openvpn_authfile.conf 不能被所有外部使用者直接刪除及修改。

[[email protected] scripts]# cat auth.sh
#!/bin/bash
#Source function library.
. /etc/init.d/functions
#config file path
FILE_PATH=/etc/openvpn_authfile.conf
[ ! -f $FILE_PATH ] && touch $FILE_PATH
usage(){
        cat <<EOF
        USAGE: `basename $0` {-add|-del|-search} username
EOF
}

#judge run user
if [ $UID -ne 0 ]; then
        echo "You are not supper user,pls call root!"
        exit 1;
fi

#judge arg numbers
if [ $# -ne 2 ]; then
        usage
        exit 2
fi
case "$1" in
        -a|-add)
                shift #<== remove $1,$2-->$1
                if grep "^$1$" ${FILE_PATH} >/dev/null 2&>1; then
                        action $"vpnuser,$1 is exist." /bin/false
                        exit
                else
                        chattr -i ${FILE_PATH} #<==lock file
                        /bin/cp ${FILE_PATH} ${FILE_PATH}.$(date +%F%T)
                        echo "$1" >> ${FILE_PATH}
                        [ $? -eq 0 ] && action $"Add $1" /bin/true
                        chattr -i ${FILE_PATH}
                fi
                ;;
        -d|del)
                shift
                if [ `grep "\b$1\b" ${FILE_PATH}|wc -l` -lt 1 ]; then
                        action $"vpnuser,$1 is not exist," /bin/false
                        exit
                else
                        chattr -i ${FILE_PATH}
                        /bin/cp ${FILE_PATH} ${FILE_PATH}.$(date +%F%T)
                        sed -i "/^${1}$/d" ${FILE_PATH}
                        [ $? -eq 0 ] && action $"Del $1" /bin/true
                        chattr -i ${FILE_PATH}
                        exit
                fi
                ;;
        -s|-search)
                shift
                if [ `grep -w "$1" ${FILE_PATH}|wc -l` -lt 1 ]; then
                        echo $"vpuser,$1 is not exist."; exit
                else
                        echo $"vpnuser,$1 is exist."; exit
                fi
                ;;
        *)
                usage
                exit
                ;;
esac                                                                                         

例 8-5 實現 Nginx 服務的啟動和關閉的功能

[[email protected] scripts]# cat nginx.sh
#!bin/bash
path=/application/nginx/sbin
pid=/application/nginx/logs/nginx.pid
RETVAL=0
. /etc/init.d/functions

start(){
        if [ ! -f $pid ];then
                $path/nginx
                RETVAL=$?
                if [ $RETVAL -eq 0 ]; then
                        action "nginx is started." /bin/true
                        return $RETVAL
                fi
        else
                echo "nginx is running"
                return 0
        fi
}
stop(){
        if [ -f $pid ]; then
                $path/nginx -s stop
                RETVAL=$?
                if [ $RETVAL -eq 0 ]; then
                        action "nginx is stopped." /bin/true
                        return $RETVAL
                else
                        action "nginx is stopped." /bin/false
                        return $RETVAL
                fi
        else
                echo "nginx is not running"
                return $RETVAL
        fi
}
case "$1" in
        start)
                start
                RETVAL=$?
                ;;
        stop)
                stop
                RETVAL=$?
                ;;
        restart)
                stop
                sleep 1
                start
                RETVAl=$?
                ;;
        *)
                echo $"Usage: $0 {start|stop|restart}"
                exit 1
esac
exit $RETVAL