<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 7.1 測試結構 - `if/then` 結構是用來檢測一系列命令的 [退出狀態](http://tldp.org/LDP/abs/html/exit-status.html#EXITSTATUSREF) 是否為0(按 UNIX 慣例,退出碼 0 表示命令執行成功),如果為0,則執行接下來的一個或多個命令。 - 測試結構會使用一個特殊的命令 `[`(參看特殊字符章節 [左方括號](http://tldp.org/LDP/abs/html/special-chars.html#LEFTBRACKET))。等同于 `test` 命令,它是一個[內建命令](http://tldp.org/LDP/abs/html/internal.html#BUILTINREF),寫法更加簡潔高效。該命令將其參數視為比較表達式或文件測試,以比較結果作為其退出狀態碼返回(0 為真,1 為假)。 - Bash 在 2.02 版本中引入了擴展測試命令 [`[[...]]`](http://tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS),它提供了一種與其他語言語法更為相似的方式進行比較操作。注意, `[[` 是一個 [關鍵字](http://tldp.org/LDP/abs/html/internal.html#KEYWORDREF) 而非一個命令。 Bash 將 `[[ $a -lt $b ]]` 視為一整條語句,執行并返回退出狀態。 - 結構 [`(( ... ))`](http://tldp.org/LDP/abs/html/dblparens.html) 和 [`let ...`](http://tldp.org/LDP/abs/html/internal.html#LETREF) 根據其執行的算術表達式的結果決定退出狀態碼。這樣的 [算術擴展](http://tldp.org/LDP/abs/html/arithexp.html#ARITHEXPREF) 結構可以用來進行 [數值比較](http://tldp.org/LDP/abs/html/comparison-ops.html#ICOMPARISON1)。 ```bash (( 0 && 1 )) # 邏輯與 echo $? # 1 *** # 然后 ... let "num = (( 0 && 1 ))" echo $num # 0 # 然而 ... let "num = (( 0 && 1 ))" echo $? # 1 *** (( 200 || 11 )) # 邏輯或 echo $? # 0 *** # ... let "num = (( 200 || 11 ))" echo $num # 1 let "num = (( 200 || 11 ))" echo $? # 0 *** (( 200 | 11 )) # 按位或 echo $? # 0 *** # ... let "num = (( 200 | 11 ))" echo $num # 203 let "num = (( 200 | 11 ))" echo $? # 0 *** # "let" 結構的退出狀態與雙括號算術擴展的退出狀態是相同的。 ``` ![caution](http://tldp.org/LDP/abs/images/caution.gif) 注意,雙括號算術擴展表達式的退出狀態碼不是一個錯誤的值。算術表達式為0,返回1;算術表達式不為0,返回0。 ```bash var=-2 && (( var+=2 )) echo $? # 1 var=-2 && (( var+=2 )) && echo $var # 并不會輸出 $var, 因為((var+=2))的狀態碼為1 ``` - `if` 不僅可以用來測試括號內的條件表達式,還可以用來測試其他任何命令。 ```bash if cmp a b &> /dev/null # 消去輸出結果 then echo "Files a and b are identical." else echo "Files a and b differ." fi # 下面介紹一個非常實用的 “if-grep" 結構: # ----------------------------------- if grep -q Bash file then echo "File contains at least one occurrence of Bash." fi word=Linux letter_sequence=inu if echo "$word" | grep -q "$letter_sequence" # 使用 -q 選項消去 grep 的輸出結果 then echo "$letter_sequence found in "$word" else echo "$letter_sequence not found in $word" fi if COMMAND_WHOSE_EXIT_STATUS_IS_0_UNLESS_ERROR_OCCURRED then echo "Command succeed." else echo "Command failed." fi ``` - 感謝 Stéphane Chazelas 提供了后兩個例子。 樣例 7-1. 什么才是真? ```bash #!/bin/bash # 提示: # 如果你不確定某個表達式的布爾值,可以用 if 結構進行測試。 echo echo "Testing \"0\"" if [ 0 ] then echo "0 is true." else echo "0 is false." fi # 0 為真。 echo echo "Testing \"1\"" if [ 1 ] then echo "1 is true." else echo "1 is false." fi # 1 為真。 echo echo "Testing \"-1\"" if [ -1 ] then echo "-1 is true." else echo "-1 is false." fi # -1 為真。 echo echo "Testing \"NULL\"" if [ ] # NULL, 空 then echo "NULL is true." else echo "NULL is false." fi # NULL 為假。 echo echo "Testing \"xyz\"" if [ xyz ] # 字符串 then echo "Random string is true." else echo "Random string is false." fi # 隨機字符串為真。 echo echo "Testing \"$xyz\"" if [ $xyz ] # 原意是測試 $xyz 是否為空,但是 # 現在 $xyz 只是一個沒有初始化的變量。 then echo "Uninitialized variable is true." else echo "Uninitialized variable is flase." fi # 未初始化變量含有null空值,為假。 echo echo "Testing \"-n \$xyz\"" if [ -n "$xyz" ] # 更加準確的寫法。 then echo "Uninitialized variable is true." else echo "Uninitialized variable is false." fi # 未初始化變量為假。 echo xyz= # 初始化為空。 echo "Testing \"-n \$xyz\"" if [ -n "$xyz" ] then echo "Null variable is true." else echo "Null variable is false." fi # 空變量為假。 echo # 什么時候 "false" 為真? echo "Testing \"false\"" if [ "false" ] # 看起來 "false" 只是一個字符串 then echo "\"false\" is true." #+ 測試結果為真。 else echo "\"false\" is false." fi # "false" 為真。 echo echo "Testing \"\$false\"" # 未初始化的變量。 if [ "$false" ] then echo "\"\$false\" is true." else echo "\"\$false\" is false." fi # "$false" 為假。 # 得到了我們想要的結果。 # 如果測試空變量 "$true" 會有什么樣的結果? echo exit 0 ``` 練習:理解 [樣例 7-1](http://tldp.org/LDP/abs/html/testconstructs.html#EX10) ```bash if [ condition-true ] then command 1 command 2 ... else # 如果測試條件為假,則執行 else 后面的代碼段 command 3 command 4 ... fi ``` ![note](http://tldp.org/LDP/abs/images/note.gif) 如果把 `if` 和 `then` 寫在同一行時,則必須在 `if` 語句后加上一個分號來結束語句。因為 `if` 和 `then` 都是 [關鍵字](http://tldp.org/LDP/abs/html/internal.html#KEYWORDREF)。以關鍵字(或者命令)開頭的語句,必須先結束該語句(分號;),才能執行下一條語句。 ```bash if [ -x "$filename" ]; then ``` ### Else if 與 elif elif `elif` 是 `else if` 的縮寫。可以把多個 `if/then` 語句連到外邊去,更加簡潔明了。 ```bash if [ condition1 ] then command1 command2 command3 elif [condition2 ] # 等價于 else if then command4 command5 else default-command fi ``` `if test condition-true` 完全等價于 `if [ condition-true ]`。當語句開始執行時,左括號 `[` 是作為調用 `test` 命令的標記[^1],而右括號則不嚴格要求,但在新版本的 Bash 里,右括號必須補上。 ![note](http://tldp.org/LDP/abs/images/note.gif) `test` 命令是 Bash 的 [內建命令](http://tldp.org/LDP/abs/html/internal.html#BUILTINREF),可以用來檢測文件類型和比較字符串。在 Bash 腳本中,`test` 不調用 `sh-utils` 包下的文件 `/usr/bin/test`。同樣,`[` 也不會調用鏈接到 `/usr/bin/test` 的 `/usr/bin/[` 文件。 ``` bash$ type test test is a shell builtin bash$ type '[' [ is a shell builtin bash$ type '[[' [[ is a shell keyword bash$ type ']]' ]] is a shell keyword bash$ type ']' bash: type: ]: not found ``` 如果你想在 Bash 腳本中使用 `/usr/bin/test`,那你必須把路徑寫全。 樣例 7-2. `test`,`/usr/bin/test`,`[]` 和 `/usr/bin/[` 的等價性 ```bash #!/bin/bash echo if test -z "$1" then echo "No command-line arguments." else echo "First command-line argument is $1." fi echo if /usr/bin/test -z "$1" # 等價于內建命令 "test" # ^^^^^^^^^^^^^ # 指定全路徑 then echo "No command-line arguments." else echo "First command-line argument is $1." fi echo if [ -z "$1" ] # 功能和上面的代碼相同。 # if [ -z "$1" 理論上可行,但是 Bash 會提示缺失右括號 then echo "No command-line arguments." else echo "First command-line argument is $1." fi echo if /usr/bin/[ -z "$1" ] # 功能和上面的代碼相同。 # if /usr/bin/[ -z "$1" # 理論上可行,但是會報錯 # # 已經在 Bash 3.x 版本被修復了 then echo "No command-line arguments." else echo "First command-line argument is $1." fi echo exit 0 ``` 在 Bash 里,``[[ ]]`` 是比 `[ ]` 更加通用的寫法。其作為擴展`test` 命令從 ksh88 中被繼承了過來。 在 ``[[`` 和 ``]]`` 中不會進行文件名擴展或字符串分割,但是可以進行參數擴展和命令替換。 ```bash file=/etc/passwd if [[ -e $file ]] then echo "Password file exists." fi ``` 使用 ``[[...]]`` 代替 ``[...]``可以避免很多邏輯錯誤。比如可以在 ``[[]]`` 中使用 ``&&``,``||``,`<` 和 `>` 操作符,而在 `[]` 中使用則會報錯。 在 ``[[]]`` 中會自動執行八進制和十六進制的進制轉換操作。 ```bash # [[ 八進制和十六進制進制轉換 ]] # 感謝 Moritz Gronbach 提出。 decimal=15 octal=017 # = 15 (十進制) hex=0x0f # = 15 (十進制) if [ "$decimal" -eq "$octal" ] then echo "$decimal equals $octal" else echo "$decimal is not equal to $octal" # 15 不等于 017 fi # 在單括號 [ ] 之間不會進行進制轉換。 if [[ "$decimal" -eq "$octal" ]] then echo "$decimal equals $octal" # 15 等于 017 else echo "$decimal is not equal to $octal" fi # 在雙括號 [[ ]] 之間會進行進制轉換。 if [[ "$decimal" -eq "$hex" ]] then echo "$decimal equals $hex" # 15 等于 0x0f else echo "$decimal is not equal to $hex" fi # 十六進制也可以進行轉換。 ``` ![note](http://tldp.org/LDP/abs/images/note.gif) 語法上并不嚴格要求在 `if` 之后一定要寫 `test` 命令或者測試結構(`[]` 或 `[[]]`)。 ```bash dir=/home/bozo if cd "$dir" 2>/dev/null; then # "2>/dev/null" 重定向消去錯誤輸出。 echo "Now in $dir." else echo "Can't change to $dir." fi ``` `if COMMAND` 的退出狀態就是`COMMAND` 的退出狀態。 同樣的,測試括號也不一定需要與 `if` 一起使用。其可以同 [列表結構](http://tldp.org/LDP/abs/html/list-cons.html#LISTCONSREF) 結合而不需要 `if`。 ```bash var1=20 var2=22 [ "$var1" -ne "$var2" ] && echo "$var1 is not equal to $var2" home=/home/bozo [ -d "$home" ] || echo "$home directory does not exist." ``` [`(( ))` 結構](http://tldp.org/LDP/abs/html/dblparens.html) 擴展和執行算術表達式。如果執行結果為0,其返回的 [退出狀態碼](http://tldp.org/LDP/abs/html/exit-status.html#EXITSTATUSREF) 為1(假)。非0表達式返回的退出狀態為0(真)。這與上述所使用的 `test` 和 `[ ]` 結構形成鮮明的對比。 樣例 7-3. 使用 `(( ))` 進行算術測試 ```bash #!/bin/bash # arith-tests.sh # 算術測試。 # (( ... )) 結構執行并測試算術表達式。 # 與 [ ... ] 結構的退出狀態正好相反。 (( 0 )) echo "Exit status of \"(( 0 ))\" is $?." # 1 (( 1 )) echo "Exit status of \"(( 1 ))\" is $?." # 0 (( 5 > 4 )) # 真 echo "Exit status of \"(( 5 > 4 ))\" is $?." # 0 (( 5 > 9 )) # 假 echo "Exit status of \"(( 5 > 9 ))\" is $?." # 1 (( 5 == 5 )) # 真 echo "Exit status of \"(( 5 == 5 ))\" is $?." # 0 # (( 5 = 5 )) 會報錯。 (( 5 - 5 )) # 0 echo "Exit status of \"(( 5 - 5 ))\" is $?." # 1 (( 5 / 4 )) # 合法 echo "Exit status of \"(( 5 / 4 ))\" is $?." # 0 (( 1 / 2 )) # 結果小于1 echo "Exit status of \"(( 1 / 2 ))\" is $?." # 舍入至0。 # 1 (( 1 / 0 )) 2>/dev/null # 除0,非法 # ^^^^^^^^^^^ echo "Exit status of \"(( 1 / 0 ))\" is $?." # 1 # "2>/dev/null" 的作用是什么? # 如果將其移除會發生什么? # 嘗試移除這條語句并重新執行腳本。 # ======================================= # # (( ... )) 在 if-then 中也非常有用 var1=5 var2=4 if (( var1 > var2 )) then #^ ^ 注意不是 $var1 和 $var2,為什么? echo "$var1 is greater then $var2" fi # 5 大于 4 exit 0 ``` [^1]: 標記是一個具有特殊意義([元語義](http://tldp.org/LDP/abs/html/x17129.html#METAMEANINGREF))的符號或者短字符串。在 Bash 里像 `[` 和 [`.(點命令)`](http://tldp.org/LDP/abs/html/special-chars.html#DOTREF) 這樣的標記可以擴展成關鍵字和命令。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看