1. 程式人生 > >bash中while,until,case,select語句結構

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


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