Linux Bash Shell學習(九):流程式控制制——if/else

來源:互聯網
上載者:User

  本文也即《Learning the bash Shell》3rd Edition的第五章Flow Control之讀書筆記,但我們將不限於此。flow control是任何程式設計語言中很常用的部分,也包括了bash。在這裡,我們將學習他們。

  if/else是通過判斷選擇執行或者執行部分代碼,可以根據變數、檔案名稱、命令是否執行成功等很多條件進行判斷,他的格式如下:

if

condition

then

    statements

[elif

condition

    then

statements.

..]

[else

    statements

]
fi

  和 C程式不一樣,bash的判斷不是通過boolean,而是通過statement,也就是執行命令後的最終狀態(exit status)。所有的Linux命令,無論你是代碼是C還是指令碼,執行完,都返回一個整數通知他的調用這,這就是exit status,通常0表示OK,其他(1-255)表示錯誤。這隻是通常的情況,例如diff,0表示你no difference,1表示difference,2表示錯誤。if判斷statements的最後一個的exit status,通常我們只放一個statement,如果為0,表示true,否則表示false。

  執行下一條命令會衝掉原來exit status。可以使用$?來查看上一命令執行的結果。例如我們希望用一個新的cd命令來替代原來在linux kernel中已將編譯的cd命令,由於function是優先於built-in命令,所以調用時,將調用我們的function。下面有一個例子,function pushd,在stack中鍵入cd的dirname路徑名,並執行跳到該路徑下。

cd ( )

{

    #由於我們已經定義了具有更高優先順序別的function,如果希望調用原來built-in的命令,需要再前面加上builtin。

    builtin

cd "$@"

    #$?是上一command的傳回值,即builtin cd "$@"的值,並記錄在result裡面。

    result=$?

    echo "$OLDPWD --> $PWD"

    #返回result的值。我們需要注意shell中的返回和在其他程式,例如C語言中的返回是不一樣的,只代表最後的exit statue,而不是所謂的傳回值,雖然也用到了return。如何沒有最後的reture,例如後面的push_func,exit status就是最後執行的command的exit status

    return

  $result

}

push_func( )

{

    dirname=$1

    #如果dirname為null,退出funcuntion,如cd dirname成功,push the directory ,否則顯示still in $PWD,cd使用function的cd函數,其優先順序別高於已在核心編譯了的cd

    if

cd ${dirname:?"missing directory name."}  

    then

        mystack="$dirname ${mystack:-$OLDPWD }"        

        echo $mystack

    else

        echo still in $PWD.        

    fi

}

push_func $1

條件結合

  和C語言一樣,可以進行條件結合,使用&&,||,以及!三種方式,表示“和”,“或”,與”非“,格式如下:if statement1

&&

statement2,

if statement1

||

statement2

,if

statement1

  exit status不是判斷的唯一值,可以使用[...]和[[...]]。

字串比較

  字串比較是放置在[...]中,有以下的幾種:

  • str1 = str2,字串1匹配字串2
  • str1 != str2,字串1不匹配字串2
  • str1 > str2,字串1大於字串2
  • str1 < str2,字串1小於字串2
  • -n str,字串不為null,長度大於零
  • -z str,字串為null,長度為零

  需要注意<和>符號和重新導向符號相似,為了避免歧義和錯誤,使用if [ $a

/>

$b

] 的方式

。仍然上面的例子,我們增加pop_func來操作stack:

    pop_func()

    {

        mystack=${mystack#* }

        #下面請至於[ ... ],即[後面有一個空格,]前面有一空格,另外$mystack用雙引號,表示這代表的是一個字串。注意到then不放在下一行,與if放在用一行,用;來隔開。

        if [ -n "$mystack" ];

then

            cd ${mystack%% *}

            echo "$PWD", stack is [$mystack]
       

else

            echo "stack empty, still in $PWD."

        fi

    }

  例如,我們要求命令帶有參數,除了使用{1?"<message"}以外,下面給出更可讀的方式:

if [ -z "$1" ]; then

    echo 'usage: c filename [-N]'

    exit

1

fi

  在這裡exit表示結束,退出,執行的結果為失敗,非零。

檔案屬性比較

  檔案屬性比較是另一個常用的條件判斷類型。

  • -a

      file

    :file 存在

  • -d

    file

    :file存在並是一個目錄

  • -e

    file

    :file 存在,同- a

  • -f

    file

    :file 存在並且是一個常規的檔案(不是目錄或者其他特殊類型檔案)

  • -r

    file

    :有讀的許可權

  • -s

    file

    :檔案存在且不為空白

  • -w

    file

    :有寫的許可權

  • -x

    file

    :有執行的許可權,或者對於目錄有search的許可權

  • -N

    file

    :在上次讀取後,檔案有改動

  • -O

    file

    :own所屬的檔案

  • -G

    file

    :group所屬的檔案

  • file1

    -nt

    file2

    :file1 比 file2 更新,以最後更新時間為準

  • file1

    -ot

    file2

    :file1 比 file2 更舊 ,以最後更新時間為準

  這些在[ ... ]中的條件判斷是可以多個結合起來,例如if [ condition ] && [ condition ]; then,當然也可以if command && [ condition ]; then,不在類推。尤其我們可以進行複製的條件判斷。另外還可以使用-a

-o

,等同於C語言中的&和|的邏輯計算複符號,他們和&&即||相似。當他們用在condition裡面。

  在上面push_func的例子中,除了判斷是否參數之外,增加判斷是否是目錄名,如下:

        if [ -n "$dirname" ] &&[ -d "$dirname" ]

        then

            cd $dirname

            mystack="$dirname ${mystack:-$OLDPWD }"       

            echo $mystack

        else

            echo still in $PWD.       

        fi

  我們在增加一個判斷,當時目錄名的時候,在檢查是否可以進行查看或操作。使用if [ -n "$dirname" ] &&[ -d "$dirname" -a -x "$dirname"

],但是這種寫法很難閱讀,我們需要將兩個前後判斷括起來,( -d "$dirname" ) -a ( -x "$dirname" )。但是(是個特殊符合,需使用/(的方式,即為:if [ -n "$dirname" ] &&[ /( -d "$dirname" /) -a /( -x "$dirname" /) ]

整數比較

  >或者<或者=是用於字串的比較,如果用於整數比較,使用:

  • -lt,小於
  • -le,小於等於
  • -eq,等於
  • -ge,大於等於
  • -gt,大於
  • -ne,不等於

相關連結:
我的Linux操作相關文章


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.