Linux學習筆記:循環,定義函數

case分支選擇結構:
    case 詞 in [模式 [| 模式]...) 命令 ;;]... esac
    case 變量引用 in
        模式1)
            分支1
            ;;
        模式2)
            分支2
            ;;
        ...
        *)
            默認分支
            ;;
    esac

模式(PATTERN):
    1.普通的文本字符
    2.globbing風格的通配符:
        *:任意長度任意字符
        ?:任意的單個字符
        []:範圍內的任意單個字符
        [^]:範圍外的任意單個字符
    3.|:或

寫一個腳本:
    提示用戶輸入信息,而後判斷用戶輸入的信息是否合法;

#!/bin/bash
#
read -p "Please make your choice[yes of no]: " CHOICE

case $CHOICE in
    yes)
        echo "right."
        ;;
    no)
        echo "wrong."
        ;;
    *)
        echo "Unknown."
        ;;
esac

if CONDITION1 ; then
    STATEMENT
elif CONDITION2 ; then
    STATEMENT
elif CONDITION3 ; then
    STATEMENT
...
else
    STATEMENT
fi

if的多分支結構和case的分支結構之間的區別:
    相同點:
        1.都是條件爲真,執行對應分支的語句;條件爲假,就不執行;
        2.均可以設置默認分支語句,即:全部條件都不匹配的時候,所執行的語句;

     不一樣點:
         1.if是根據命令的執行狀態返回值來判斷正確與否;case是根據變量的值的取值內容是否匹配模式來判斷正確與否;
         2.case的每一個分支都必須使用';;'結束;


管理用戶帳戶的腳本,第四版:利用case語句實現
#!/bin/bash
#
if [ $# -lt 2 ] ; then
  echo "Usage: $(basename $0) -a User1,User2,...,UserN | -d User1,User2,...,UserN."
  exit 5
fi

case $1 in
  -a)
      for I in $(echo $2 | tr ',' ' ') ; do
        if id $I &> /dev/null ; then
          echo "$I exists already."
        else
          useradd $I
          echo $I | passwd --stdin $I &> /dev/null
          echo "Create $I successfully."
        fi
      done
  ;;
  -d)
      for J in $(echo $2 | tr ',' ' ') ; do
        if id $J &> /dev/null ; then
          userdel -r $J
          echo "Delte $J finished."
        else
          echo "User $J does not exist."
        fi
      done
  ;;
  *)
      echo "Usage: $(basename $0) -a User1,User2,...,UserN | -d User1,User2,...,UserN."
      exit 6
esac

while
    while 命令; do 命令; done
    while CONDITION ; do
        循環體
    done
        進入循環條件:CONDITION一直爲真;
        退出循環條件:CONDITION爲假;

until
    until 命令; do 命令; done
    until CONDITION ; do
        循環體
    done
        進入循環條件:CONDITION一直爲假;
        退出循環條件:CONDITION爲真;

while CONDITION ; do CMD ; done
至關於
until ! CONDITION ; do CMD ; done

注意:對於while和until兩個循環結構來說,若是要實施變量增量操做,必須手動給出;

利用while和until循環結構,計算100之內全部整數的和;
#!/bin/bash
#
declare -i I=1
while [ $I -le 100 ] ; do
    let SUM+=$I
    let I++
done
echo $SUM

#!/bin/bash
#
declare -i I=1
until [ $I -gt 100 ] ; do
    let SUM+=$I
    let I++
done
echo $SUM

循環控制語句:
    continue
    break

continue:
    continue [n]
    提早結束第n層的本次循環,直接進入下一輪條件判斷,若符合循環進入條件,則開啓下一輪循環;

break:
    break [n]
    提早技術第n層循環;再也不繼續後續循環;

無限循環用法:
while true ; do
    循環體
done

until false ; do
    循環體
done

在此類的循環結構中,必須適當的使用continue和break,以保證循環不會一直持續下去;

可以實現遍歷功能的while循環和until循環;
while read LINES ; do
    循環體
done < /PATH/FROM/SOMEFILE

until ! read LINES ; do
    循環體
done < /PATH/FROM/SOMEFILE

select
    select循環主要用於建立一個菜單式列表,供用戶進行選擇;
    列表是按照數字順序排列的,咱們只要選擇數字便可;

    通常來說,select與case一塊兒使用;

    select是一個無限循環結構,所以,必須在循環體中使用break命令以退出循環,或者能夠使用exit命令直接終止腳本運行;

    select NAME [in 詞語 ... ;] do 命令; done

    select NAME [in LIST] ; do
        命令
    done


定義函數:
    函數是由兩部分組成:
        函數名稱 + 函數體(可以實現獨立功能的shell語句塊)

    語法一:
        function func_name {
            函數體
        }

    語法二:
        func_name() {
            函數體
        }
        注意:函數名和()之間不能加空白字符;

    注意:函數能夠在交互式環境下定義,也能夠在腳本中定義;

函數的使用
    函數在定義的時候,其函數體中包含的全部命令均不會被執行;只有函數被調用的時候,纔會執行其中的命令語句;

    調用方式:經過直接給出函數名稱的方式調用;

有不少的函數是存放於專門用於保存函數的文件中;若是想要調用這樣的文件中保存的函數,使用source命令(.)加載文件,而後再以直接給出函數名稱的方式調用函數;

使用set命令能夠查看全部當前shell中生效的函數;
使用unset命令能夠撤銷已經定義的函數;

函數的返回值:
    兩種返回值:
        函數的執行結果的返回值:
            1.在函數體中使用了echo或printf命令輸出的結果;
            2.在函數體中某些命令輸出的結果;
        函數的狀態返回值:
            1.函數中最後一條命令的執行狀態返回值;
            2.自定義退出狀態碼:
                return [n]
                    n:0-255 (1 2 127儘量不使用)
                    0: 表示無錯誤返回
                    1-255:有錯誤返回

                注意:只要函數在執行時,遇到了return命令,無論函數中的命令語句是否所有執行完成,馬上退出函數;

函數的生命週期:
    從被調用開始,到遇到return命令或所有的語句執行完成爲止;

函數的實參
    在函數體中,能夠使用$1,$2,..位置變量爲函數提供參數;還能夠使用$*或$@的方式引用全部位置參數;還能夠使用$#計算爲函數傳遞的參數個數;

    在調用函數的時候,直接在函數名稱後面以空白字符分隔多個參數便可;好比:func_name arg1 arg2 ...

    傳遞給函數參數的位置參數,是調用函數的時候,函數名稱後面的以空白字符分隔的字符串序列;跟腳本的位置參數不是一回事;

變量:
    shell中的變量爲弱變量
        1.無需事先聲明
        2.無需指定變量類型,默認爲字符型

    變量分類:
        環境變量:
            當前shell及子shell
        本地變量:
            當前shell
        局部變量:
            local VAR_NAME=VALUE
            當前函數體
        位置變量
        特殊變量

建議:手動撤銷本身定義或聲明的全部變量;

函數的遞歸調用
    簡單來講,就是在函數體中調用函數自身;

    階乘:
        N!=N*(N-1)!=N*(N-1)*(N-2)!=...=N*(N-1)*(N-2)*...*2*1
    shell代碼:
#!/bin/bash
# Author: Tianyu.Zhao
#
fact(){
  if [ $1 -eq 0 ] || [ $1 -eq 1 ] ; then
    echo 1
  else
    echo "$[$1*$(fact $[$1-1])]"
  fi
}

echo -n "$1!="
fact $1shell

相關文章
相關標籤/搜索