bash中while,until,case,select語句結構

case語句:shell

    在腳本中使用case結構:
             case ${VAR_NAME} in
                 PATTERN1)
                     COMMAND
                     ...
                     ;;
                 PATTERN2)
                     COMMAND
                     ...
                     ;;
                 ...
             esac

             PATTERN(模式)能夠是下列幾類字符:
                 1.普通的文本字符
                 2.Globbing風格的通配符:
                     *:任意長度的任意字符
                     ?:任意單個字符;
                     []:指定範圍內的任意單個字符;
                     [^]:指定範圍之外的任意單個字符;
                 3.|
                     或字符bash

if的多分支結構和case的選擇分支結構的異同:
    相同點:
        1.判斷的條件爲真時,纔會執行對應分支中的語句;條件爲假,就跳過不執行;
        2.均可以設置默認分支語句,即:全部給定的條件的判斷都爲假時,纔會執行的語句;

    不一樣點:
        1.if是根據命令的執行狀態返回值的真或假來判斷執行某個分支中的語句;
            case是根據變量中所保存的值與指定的模式匹配的結果的真或假來判斷是否該執行某個分支中的語句;
        2.if的每一個分支中無需單獨到的結束標記,case的每一個分支都必須以;;結束;ide


編寫管理用戶帳戶的腳本,第四版,利用case語句+for循環,同時接受建立和刪除用戶的操做;

函數

#!/bin/bash
#
#helps函數,顯示提示信息和幫助信息
helps(){
    echo -e "Usage: $(basename $0) options... USERLIST\n"
    echo -e "  Options: "
    echo -e "    -a, --add: \vAdd some users from USERLIST."
    echo -e "    -d, --delete: \vDelete some users from USERLIST."
    echo -e "    -h, --help: \vPrint help informationn."
    echo -e "    -v, --verbose: \vPrint more informationn about manage users."
    echo
    echo -e "  USERLIST FORMAT: "
    echo -e "    USERNAME1,USERNAME2,...,USERNAMEN"
}
#輸入的選項的個數
if [ $# -lt 1 ] ; then 
       helps
    exit 5
fi
ADDUSER=0
DELUSER=0
DEBUG=0
#對選項進行篩選執行
for I in $(seq $#) ; do
    if [ $# -ne 0 ] ;then 
        case $1 in
            -h|--help)
                helps
                exit 0
                ;;
            -v|--verbose)
                DEBUG=1
                shift
                ;;
            -a|--add)
                ADDUSERLIST=$2
                ADDUSER=1
                shift 2
                ;;
            -d|--delete)
                DELUSERLIST=$2
                DELUSER=1
                shift 2
                ;;
            *)
                helps
                exit 6
                ;;
        esac
    fi
done
#執行添加用戶的操做
if [ $ADDUSER -eq 1 ] ; then
    for J in $(echo $ADDUSERLIST | tr ',' ' ') ; do
        if ! id $J &> /dev/null ; then
            useradd $J &> /dev/null
            echo $J | passwd --stdin $J &> /dev/null
            [ $DEBUG -eq 1 ] && echo "Create user $J successfully."
        else
            echo "$J exist already."
        fi
    done
fi
#執行刪除用戶操做
if [ $DELUSER -eq 1 ] ; then
    for J in $(echo $DELUSERLIST | tr ',' ' ') ; do
        if id $J &> /dev/null ; then
            userdel -r $J &> /dev/null
            [ $DEBUG -eq 1 ] && echo "Delete user $J finished."
        else
            echo "$J does not exist yet."
        fi
    done
fi
#不管選項位置是先-a或者後-a都會先執行添加用戶操做,由於添加用戶的操做執行在前邊,順序執行腳本的內容。

while循環結構
    while: while COMMANDS; do COMMANDS; done

    在腳本中能夠寫成下列結構:
        while CONDITION ; do
            COMMANDS
        done

    while循環進入循環的條件:CONDITION邏輯判斷結果爲
    while循環退出循環的條件:CONDITION邏輯判斷結果爲
    
until循環結構
    until: until COMMANDS; do COMMANDS; done

    在腳本中能夠寫成下列結構:
        until CONDITION ; do
            COMMANDS
        done

    until循環進入循環的條件:CONDITION邏輯判斷結果爲
    until循環退出循環的條件:CONDITION邏輯判斷結果爲

注意
    1.while CONDITION 至關於 until ! CONDITION
    2.while和until循環結構中,沒有變量自增或自減的變化方法,所以須要使用語句手動給出變量的變化方式;oop


寫一個腳本,使用while或until循環,計算100之內整數的和;
ui

#!/bin/bash
#
#在$I=100的時候,退出循環,不然判斷會進入101
declare -i I=0
until [ $I -eq 100 ] ; do
    let I++
    let SUM+=$I
done
echo $SUM


#!/bin/bash
#
declare -i I=0
while [ $I -lt 100 ] ; do
    let I++
    let SUM+=$I
done
echo $SUM

循環控制語句:
    continue
        continue: continue [n]
        Resume for, while, or until loops.
        提早結束第n層當前循環,直接進入下一輪條件判斷,若是條件判斷結果仍然知足循環進入條件,則開啓下一輪循環;

    break
        break: break [n]
        Exit for, while, or until loops.

        提早結束第n層的循環,並且再也不繼續後續循環;

while和until的兩種特殊循環使用方法:
    1.無限循環方法:
        while true ; do
            COMMANDS
        done

        until false ; do
            COMMANDS
        done

猜數字遊戲:
orm

#!/bin/bash
#
NUMBER=$[RANDOM%100+1]
while true ; do
  read -p "Input a number: " INPTNUM
  if [ $INPTNUM -gt $NUMBER ] ; then
    echo "Too big"
  elif [ $INPTNUM -lt $NUMBER ] ; then
    echo "Too small"
  else
    echo "Yes! you WIN. That's $NUMBER."
#在輸入數字和隨機數字匹配的時候,就退出
    break
  fi
done
#!/bin/bash
#
NUMBER=$[RANDOM%100+1]
until false ; do
  read -p "Input a number: " INPTNUM
  if [ $INPTNUM -gt $NUMBER ] ; then
    echo "Too big"
  elif [ $INPTNUM -lt $NUMBER ] ; then
    echo "Too small"
  else
    echo "Yes! you WIN. That's $NUMBER."
    break
  fi
done



注意:在此類循環結構中,須要適當的添加continue或break控制語句,以使得無限循環可控;

    2.實現遍歷功能的while和until循環結構:
        while read LINES ; do
            COMMANDS
        done < /PATH/FROM/SOMEFILE

        until ! read LINES ; do
            COMMANDS
        done < /PATH/FROM/SOMEFILE

注意:在作遍歷循環時,建議使用for;遊戲

select循環結構
    select: select NAME [in WORDS ... ;] do COMMANDS; done
        Select words from a list and execute commands.

    select循環也是一種遍歷列表的方式建立一個可視化菜單,每一個列表項都有一個數字編號與之對應,供用戶選擇使用;而用戶只須要選擇其編號便可;

    select是一種默認無限循環結構,所以,必須在循環體中爲select提供退出循環的條件,一般可使用break或exit命令實現;

    一般狀況下,select循環會和case一塊兒使用,已進行合理的取值判斷;

    在腳本中實現的格式:
        select VAR_NAME in LIST ; do
            COMMANDS
        done

寫一個腳本,顯示以/bin/bash爲默認shell的用戶的ID信息;
it

#!/bin/bash
#
#挑選用戶名或者quit退出按鈕
select I in $(awk -F : '/\/bin\/bash$/{print $1}' /etc/passwd) quit ; do
  case $I in
  quit)
    exit
    ;;
  *)
    echo "The UID of $I is $(id -u $I)"
    ;;
  esac
done
相關文章
相關標籤/搜索