在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Linux/ 流程控制:case 分支
網(wǎng)絡(luò)系統(tǒng)
打印
重定向
使用命令
位置參數(shù)
權(quán)限
文本處理
疑難排解
layout: book-zh title: 自定制 shell 提示符
查找文件
layout: book-zh title: vi 簡(jiǎn)介
shell 環(huán)境
什么是 shell
編譯程序
鍵盤高級(jí)操作技巧
流程控制:case 分支
流程控制:if 分支結(jié)構(gòu)
layout: book-zh title: 軟件包管理
進(jìn)程
存儲(chǔ)媒介
格式化輸出
編寫第一個(gè) Shell 腳本
啟動(dòng)一個(gè)項(xiàng)目
流程控制:while/until 循環(huán)
文件系統(tǒng)中跳轉(zhuǎn)
字符串和數(shù)字
讀取鍵盤輸入
歸檔和備份
探究操作系統(tǒng)
流程控制:for 循環(huán)
自頂向下設(shè)計(jì)
數(shù)組
操作文件和目錄
奇珍異寶
從 shell 眼中看世界
正則表達(dá)式

流程控制:case 分支

在這一章中,我們將繼續(xù)看一下程序的流程控制。在第28章中,我們構(gòu)建了一些簡(jiǎn)單的菜單并創(chuàng)建了用來(lái) 應(yīng)對(duì)各種用戶選擇的程序邏輯。為此,我們使用了一系列的 if 命令來(lái)識(shí)別哪一個(gè)可能的選項(xiàng)已經(jīng)被選中。 這種類型的構(gòu)造經(jīng)常出現(xiàn)在程序中,出現(xiàn)頻率如此之多,以至于許多編程語(yǔ)言(包括 shell) 專門為多選決策提供了一種流程控制機(jī)制。

case

Bash 的多選復(fù)合命令稱為 case。它的語(yǔ)法規(guī)則如下所示:

case word in
    [pattern [| pattern]...) commands ;;]...
esac

如果我們看一下第28章中的讀菜單程序,我們就知道了用來(lái)應(yīng)對(duì)一個(gè)用戶選項(xiàng)的邏輯流程:

#!/bin/bash
# read-menu: a menu driven system information program
clear
echo "
Please Select:
1. Display System Information
2. Display Disk Space
3. Display Home Space Utilization
0. Quit
"
read -p "Enter selection [0-3] > "
if [[ $REPLY =~ ^[0-3]$ ]]; then
    if [[ $REPLY == 0 ]]; then
        echo "Program terminated."
        exit
    fi
    if [[ $REPLY == 1 ]]; then
        echo "Hostname: $HOSTNAME"
        uptime
        exit
    fi
    if [[ $REPLY == 2 ]]; then
        df -h
        exit
    fi
    if [[ $REPLY == 3 ]]; then
        if [[ $(id -u) -eq 0 ]]; then
            echo "Home Space Utilization (All Users)"
            du -sh /home/*
        else
            echo "Home Space Utilization ($USER)"
            du -sh $HOME
        fi
        exit
    fi
else
    echo "Invalid entry." >&2
    exit 1
fi

使用 case 語(yǔ)句,我們可以用更簡(jiǎn)單的代碼替換這種邏輯:

#!/bin/bash
# case-menu: a menu driven system information program
clear
echo "
Please Select:
1. Display System Information
2. Display Disk Space
3. Display Home Space Utilization
0. Quit
"
read -p "Enter selection [0-3] > "
case $REPLY in
    0)  echo "Program terminated."
        exit
        ;;
    1)  echo "Hostname: $HOSTNAME"
        uptime
        ;;
    2)  df -h
        ;;
    3)  if [[ $(id -u) -eq 0 ]]; then
            echo "Home Space Utilization (All Users)"
            du -sh /home/*
        else
            echo "Home Space Utilization ($USER)"
            du -sh $HOME
        fi
        ;;
    *)  echo "Invalid entry" >&2
        exit 1
        ;;
esac

case 命令檢查一個(gè)變量值,在我們這個(gè)例子中,就是 REPLY 變量的變量值,然后試圖去匹配其中一個(gè)具體的模式。 當(dāng)與之相匹配的模式找到之后,就會(huì)執(zhí)行與該模式相關(guān)聯(lián)的命令。若找到一個(gè)模式之后,就不會(huì)再繼續(xù)尋找。

模式

這里 case 語(yǔ)句使用的模式和路徑展開中使用的那些是一樣的。模式以一個(gè) “)” 為終止符。這里是一些有效的模式。

表32-1: case 模式實(shí)例
模式 描述
a) 若單詞為 “a”,則匹配
[[:alpha:]]) 若單詞是一個(gè)字母字符,則匹配
???) 若單詞只有3個(gè)字符,則匹配
*.txt) 若單詞以 “.txt” 字符結(jié)尾,則匹配
*) 匹配任意單詞。把這個(gè)模式做為 case 命令的最后一個(gè)模式,是一個(gè)很好的做法, 可以捕捉到任意一個(gè)與先前模式不匹配的數(shù)值;也就是說(shuō),捕捉到任何可能的無(wú)效值。

這里是一個(gè)模式使用實(shí)例:

#!/bin/bash
read -p "enter word > "
case $REPLY in
    [[:alpha:]])        echo "is a single alphabetic character." ;;
    [ABC][0-9])         echo "is A, B, or C followed by a digit." ;;
    ???)                echo "is three characters long." ;;
    *.txt)              echo "is a word ending in '.txt'" ;;
    *)                  echo "is something else." ;;
esac

還可以使用豎線字符作為分隔符,把多個(gè)模式結(jié)合起來(lái)。這就創(chuàng)建了一個(gè) “或” 條件模式。這對(duì)于處理諸如大小寫字符很有用處。例如:

#!/bin/bash
# case-menu: a menu driven system information program
clear
echo "
Please Select:
A. Display System Information
B. Display Disk Space
C. Display Home Space Utilization
Q. Quit
"
read -p "Enter selection [A, B, C or Q] > "
case $REPLY in
q|Q) echo "Program terminated."
     exit
     ;;
a|A) echo "Hostname: $HOSTNAME"
     uptime
     ;;
b|B) df -h
     ;;
c|C) if [[ $(id -u) -eq 0 ]]; then
         echo "Home Space Utilization (All Users)"
         du -sh /home/*
     else
         echo "Home Space Utilization ($USER)"
         du -sh $HOME
     fi
     ;;
*)   echo "Invalid entry" >&2
     exit 1
     ;;
esac

這里,我們更改了 case-menu 程序的代碼,用字母來(lái)代替數(shù)字做為菜單選項(xiàng)。注意新模式如何使得大小寫字母都是有效的輸入選項(xiàng)。

執(zhí)行多個(gè)動(dòng)作

早于版本號(hào)4.0的 bash,case 語(yǔ)法只允許執(zhí)行與一個(gè)成功匹配的模式相關(guān)聯(lián)的動(dòng)作。 匹配成功之后,命令將會(huì)終止。這里我們看一個(gè)測(cè)試一個(gè)字符的腳本:

#!/bin/bash
# case4-1: test a character
read -n 1 -p "Type a character > "
echo
case $REPLY in
    [[:upper:]])    echo "'$REPLY' is upper case." ;;
    [[:lower:]])    echo "'$REPLY' is lower case." ;;
    [[:alpha:]])    echo "'$REPLY' is alphabetic." ;;
    [[:digit:]])    echo "'$REPLY' is a digit." ;;
    [[:graph:]])    echo "'$REPLY' is a visible character." ;;
    [[:punct:]])    echo "'$REPLY' is a punctuation symbol." ;;
    [[:space:]])    echo "'$REPLY' is a whitespace character." ;;
    [[:xdigit:]])   echo "'$REPLY' is a hexadecimal digit." ;;
esac

運(yùn)行這個(gè)腳本,輸出這些內(nèi)容:

[me@linuxbox ~]$ case4-1
Type a character > a
'a' is lower case.

大多數(shù)情況下這個(gè)腳本工作是正常的,但若輸入的字符不止與一個(gè) POSIX 字符集匹配的話,這時(shí)腳本就會(huì)出錯(cuò)。 例如,字符 “a” 既是小寫字母,也是一個(gè)十六進(jìn)制的數(shù)字。早于4.0的 bash,對(duì)于 case 語(yǔ)法絕不能匹配 多個(gè)測(cè)試條件。現(xiàn)在的 bash 版本,添加 “;;&” 表達(dá)式來(lái)終止每個(gè)行動(dòng),所以現(xiàn)在我們可以做到這一點(diǎn):

#!/bin/bash
# case4-2: test a character
read -n 1 -p "Type a character > "
echo
case $REPLY in
    [[:upper:]])    echo "'$REPLY' is upper case." ;;&
    [[:lower:]])    echo "'$REPLY' is lower case." ;;&
    [[:alpha:]])    echo "'$REPLY' is alphabetic." ;;&
    [[:digit:]])    echo "'$REPLY' is a digit." ;;&
    [[:graph:]])    echo "'$REPLY' is a visible character." ;;&
    [[:punct:]])    echo "'$REPLY' is a punctuation symbol." ;;&
    [[:space:]])    echo "'$REPLY' is a whitespace character." ;;&
    [[:xdigit:]])   echo "'$REPLY' is a hexadecimal digit." ;;&
esac

當(dāng)我們運(yùn)行這個(gè)腳本的時(shí)候,我們得到這些:

[me@linuxbox ~]$ case4-2
Type a character > a
'a' is lower case.
'a' is alphabetic.
'a' is a visible character.
'a' is a hexadecimal digit.

添加的 “;;&” 的語(yǔ)法允許 case 語(yǔ)句繼續(xù)執(zhí)行下一條測(cè)試,而不是簡(jiǎn)單地終止運(yùn)行。

總結(jié)

case 命令是我們編程技巧口袋中的一個(gè)便捷工具。在下一章中我們將看到, 對(duì)于處理某些類型的問(wèn)題來(lái)說(shuō),case 命令是一個(gè)完美的工具。

拓展閱讀

上一篇:重定向下一篇:正則表達(dá)式