日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

(027) Linux之shell分支if语句

發布時間:2023/12/2 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (027) Linux之shell分支if语句 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

十年運維系列之基礎篇 - Linux

作者:曾林?

聯系:1494445739@qq.com

網站:www.jplatformx.com

版權:文章未經同意請勿轉載


?

一、使用if語句

通過shell,我們可以來寫出這樣的一個使用if語句的shell腳本片段。如下所示:

#!/bin/bash # test "if" statementx=5if [ $x = 5 ]; thenecho "x equals 5" elseecho "x doesn't equals 5" fi

? ? ? 或者可以直接在命令行中輸入以上代碼(略有簡化),如下圖所示:

? ? ? if語句的語法格式如下:

if commands; thencommands [elif commands; thencommands] [elsecommands] if

? ? ? 在這個語法格式中,“command”可以是一組命令。乍看上去可能會有些迷惑。在去除這個迷惑之前,我們必須要先了解一下shell如何判斷一個命令的成功與失敗。

?

二、退出狀態

  命令(包括我們編寫的shell腳本和shell函數)在執行完畢后,會向操作系統發送一個值,稱之為“退出狀態”。這個值是一個0~255的整數,用來指示命令執行成功還是失敗。按照慣例,數值0表示執行成功,其他的數值表示執行失敗。shell提供了一個可以用來檢測退出狀態的參數。這個參數就是$?。如下圖所示:

  在這個例子中,我們兩次執行了ls命令。第一次,命令執行成功,如果顯示參數“$?”的值,可以看到值是0.第二次執行ls命令時,產生了一個錯誤,再次顯示“$?”的值,這次值是2,表示這個命令遇到了一個錯誤。有些命令使用不同的退出值來診斷錯誤,而需要命令執行失敗時,只是簡單地退出并發送數字1.man手冊中經常會包括一個標題為“Exit Status”的段落,它描述使用的代碼。數字0總是表示執行成功。

  shell提供了2個非常簡單的內置命令,它們不做任何事情,除了以一個0或1退出狀態來終止執行。“true”命令總是表示執行成功,而“false”命令總是表示執行失敗。如下圖所示:

  我們可以用這兩個命令來查看if語句是如何工作的。if語句真正做的事情是評估命令的成功或失敗。

  當在if后面的命令執行成功時,命令echo "it's true."會被執行,而當在if后面的命令執行失敗時,該命令則不執行。如果在if后面有一系列的命令,那么則根據最后一個命令的執行結果來進行評估。如下圖所示:

?

三、使用test命令

  目前為止,經常和if一起使用的命令是test。test命令會執行各種檢查和比較。這個命令有兩種等價的形式:

  test expression

  以及更加流行的

  [ expression ]

  這里的expression是一個表達式,其結果是true或false。當這個表達式為true時,test命令會返回一個0退出狀態;當表達式為false時,test命令的退出狀態為1。

  • 文件表達式(expression)

  •   下表中的表達式展示的是有關文件的表達式。這些文件表達式用來評估文件的狀態。

    文件表達式成為true的條件
    file1 -ef file2file1和file2擁有相同的信息節點編號(這兩個文件通過硬鏈接指向同一個文件)
    file1 -nt file2file1比file2新
    file1 -ot file2file1比file2舊
    -b filefile存在并且是一個塊(設備)文件
    -c filefile存在并且是一個字符(設備)文件
    -d filefile存在并且是一個目錄
    -e filefile存在
    -f filefile存在并且是一個普通文件
    -g filefile存在并且設置了組ID
    -G filefile存在并且屬于有效組ID
    -k filefile存在并且有“粘滯位(sticky bit)屬性”
    -L filefile存在并且是一個符號鏈接
    -O filefile存在并且屬于有效用戶ID
    -p filefile存在并且是一個命名管道
    -r filefile存在并且可讀(有效用戶有可讀權限)
    -s filefile存在并且其長度大于0
    -S filefile存在并且是一個網絡套接字
    -t fdfd是一個定向到終端/從終端定向的文件描述符,可以用來確定標準輸入/輸出/錯誤是否被重定向
    -u filefile存在并且設置了setuid位
    -w filefile存在并且可寫(有效用戶擁有可寫權限)
    -x filefile存在并且可執行(有效用戶擁有執行/搜索權限)

      下面代碼展示了一個使用文件表達式的例子:

    #!/bin/bash# test-file: Evaluate the status of a fileFILE=~/.bashrcif [ -e "$FILE" ]; thenif [ -f "$FILE" ]; thenecho "$FILE is a regular file."fi if [ -d "$FILE" ]; thenecho "$FILE is a directory."fi if [ -r "$FILE" ]; thenecho "$FILE is readable."fi if [ -w "$FILE" ]; thenecho "$FILE is writable."fi if [ -x "$FILE" ]; thenecho "$FILE is executable/searchable."fi elseecho "$FILE does not exist"exit 1 fiexit

      關于上面的腳本,需要注意兩個有趣的地方。首先,要注意$FILE在表達式內是如何被引用的。盡管引號不是必需的,但是這可以防范參數為空的情況。如果$FILE的參數擴展產生一個空值,將導致一個錯誤(操作符會被解釋為非空的字符串,而不是操作符)。用引號把參數括起來可以確保操作符后面總是跟隨一個字符串,即使字符串為空。其次,注意腳本末尾的exit命令。這個exit命令接受一個單獨的可選參數,它將稱為腳本的退出狀態。當不傳遞參數時,退出狀態默認為0。以這種方法使用exit命令,當$FILE擴展為一個不存在的文件名時,可以允許腳本提示失敗。這個exit命令出現在腳本的最后一行。這樣,當腳本執行到最后時,不管怎么樣,默認情況下它將以退出狀態0終止。

      類似地,通過在return命令中包含一個整數參數,shell函數可以返回一個退出狀態。如果要將上面的腳本轉換為一個shell函數,從而能夠在一個更大的程序中使用,可以將exit命令替換為return命令,并得到想要的行為。

    ?

    四、字符串表達式

      下列表達式用來測試字符串的操作。

    表達式稱為true的條件
    stringstring不為空
    -n stringstring的長度大于0
    -z stringstring的長度等于0

    string1 = string2

    string1 == string2

    string1和string2相等。單等號和雙等號都可以使用,但是雙等號使用的更多。要注意在使用等號和不等于號的時候,需要操作符兩邊加空格。否則執行結果不是你想象
    string1 > string2在排序時,string1在string2之后
    string1 < string2在排序時,string1在string2之前
    string1 != string2string1和string2不相等

      警告:在使用test命令時,“>”和“<”運算符必須用引號括起來(或者是使用反斜杠來進行轉義)。如果不這么做,就會被shell解釋為重定向操作符,從而造成潛在的破壞性結果。同時注意,盡管bash文檔中已經有過聲明,排序遵從當前語系的排列規則,但并非如此。在bash 4.0版本以前(包括4.0版本),使用的是ASCII(POSIX)排序方式。

    ?

    五、整數表達式

      下表中的表達式可以用于整數。

    表達式成為true的條件
    integer1 -eq integer2integer1和integer2相等
    integer1 -ne integer2integer1和integer2不相等
    integer1 -le integer2integer1小于等于integer2
    integer1 -lt integer2integer1小于integer2
    integer -gt integer2integer1大于integer2
    integer1 -ge integer2integer1大于等于integer2

    ?

    六、更現代的test指令

      bash提供了復合命令(()),而不是[](test指令)用來操作整數。該命令支持一套完整的算術計算。

      復合指令(())用于執行算術真值測試(arithmetic truth test)。當算術計算的結果是非0值時,則算術真值測試為true。

    ? ? ? 以下是一個使用(())復合命令來測試算術結果的樣例腳本,注意這里使用了小于號、等于號和大于號來測試相等性。在處理整數的時候,這些語法看起來更加的自然。此外,由于(())復合命令只是shell語法的一部分,而非普通的命令,并且只能處理整數。

    #!/bin/bash# compound command (()) for arithmetic computingINT=7if [ -z "$INT" ]; thenecho "INT is empty." >&2exit 1 elif (( $INT == 0 )); thenecho "INT equals zero." elif (( $INT < 0 )); thenecho "INT less than zero." elif (( $INT > 0)); thenecho "INT greater than zero." fiif (( $INT % 2 == 0)); thenecho "INT is even." elseecho "INT is odd." fi

    ?

    七、組合表達式

      我們也可以將表達式組合起來,來創建更復雜的計算。表達式是使用邏輯運算符組合起來的。與test命令配套的邏輯運算符有三個,它們是and, or和not。下表展示了邏輯操作符。

    Operationtest(())
    AND-a&&
    OR-o||
    NOT!!

    ?

    八、控制運算符:另一種方式的分支

      bash還提供了兩種可以執行分支的控制運算符。“&&”和“||”運算符與上述復合命令中的邏輯運算符類似,語法如下:

      command1 && command2 和 command1 || command2

      理解這兩個運算符是非常重要的。對于“&&”運算符來說,先執行command1,只有在command1執行成功時,command2才能夠執行。對于“||”運算符來說,先執行command1,則只有command1執行失敗的時候,command2才能夠執行。

    ? ? ? 從實用性考慮,這意味著可以這樣做:

    mkdir test && cd test

      這會創建一個temp目錄,并且當這個創建工作執行成功后,當前的工作目錄才會更改為temp。只有在第一個mkdir命令執行成功后,才會嘗試執行第二個命令。同樣,看如下命令:

    [ -d temp ] || mkdir temp

      這個命令先檢測temp目錄是否存在,只有當檢測失敗時,才會創建這個目錄。

    ?

    轉載于:https://www.cnblogs.com/jplatformx/p/4344575.html

    總結

    以上是生活随笔為你收集整理的(027) Linux之shell分支if语句的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。