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

來源:互聯網
上載者:User

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

case語句:

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

        PATTERN(模式)可以是下列幾類字元:
           1.普通的文本字元
           2.Globbing風格的萬用字元:
               *:任意長度的任一字元
               ?:任意單個字元;
               []:指定範圍內的任意單個字元;
               [^]:指定範圍以外的任意單個字元;
           3.|
               或字元

if的多分支結構和case的選擇分支結構的異同:
相同點:
   1.判斷的條件為真時,才會執行對應分支中的語句;條件為假,就跳過不執行;
   2.都可以設定預設分支語句,即:所有給定的條件的判斷都為假時,才會執行的語句;

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

編寫系統管理使用者賬戶的指令碼,第四版,利用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迴圈結構中,沒有變數自增或自減的變化方法,因此需要使用語句手動給出變數的變化方式;

寫一個指令碼,使用while或until迴圈,計算100以內整數的和;

#!/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

猜數字遊戲:

#!/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資訊;

#!/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

本文永久更新連結地址:https://www.bkjia.com/Linux/2018-03/151446.htm

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.