<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                總第1篇 test就是測試的意思,常用在流程控制語句中作為條件。下面做一下介紹。 ## 關于真值 與其他語言不同,Bash(包括其他Shell)中,是用0表示真,非0表示假的。 之所以用0表示成功,而不是1來表示。我認為也是有一定道理的,因為成功的情況只有一種,而出錯的可能卻有許多,所以用正數來表示錯誤。不同的正數代表著不同的錯誤,所以一般情況下可以通過正數的值來判斷是出了什么錯誤。 > 如果你有過POSIX編程經驗(比如Linux下C編程),你會知道一個errno的東西。你也會知道大量的if語句用來測試一個函數的調用結果,每個函數基本上都是返回0時表示操作成功,而如果返回非0則出錯,此時你也要exit(0)。 下面言歸正傳 ## 測試整數 ### 基本規則 整數的test就是大小關系的比較,與其他語言不同,Bash中沒有使用<,>來做大于等于號,而是使用了減號開頭的選項來比較。 假如有兩個整數變量a和b。那么比較a是否大于b,就寫作`test $a -gt $b`,符合條件返回真值0。 實際在終端里測試的時候可以這樣寫來看test語句的執行結果: ~~~ test $a -gt $b && echo Yes ~~~ 如果條件成立打印 Yes,不成立不打印。 ### 全部選項 | 選項 | 描述 | 英文全稱 | |-----|-----|-----| | eq | 等于 | equal | | gt | 大于 | greater than | | lt | 小于 | less than | | ne | 不等于 | not equal | | ge | 大于等于 | greater or equal | | le | 小于等于 | less or equal | 注意: > 每個選項前需要有一個短橫線`-`。 還要注意的是使用以上操作符,那么操作符兩邊一定要是整數。 在Bash中,即使給整數加了引號,比如"123",也視作整數。但如果某一位含有整數[0-9]以外的字符比如,12a,"12a",則不行。 Bash腳本,或者說Shell終端中的各種命令都有很豐富的選項,所以我建議在記憶的時候要去記憶它的英文全稱,理解了它的含義,這樣反而會降低記憶的難度。 ## 測試字符串 字符串的測試無非就是包括,判斷兩個字符串是否相等,判斷一個字符串是否為空。 假設str1和str2是持有兩個字符串的變量(直接測試兩個字符串,而非字符串變量時,則不加$,這很好理解)。具體用法為: | 用法 | 描述 | |-----|-----| | `test $str1 = $str2` | 測試是否相等,相等返回0 | | `test $str1 != $str2` | 測試是否不等,不等返回0 | | `test $str1 \< $str2` | 如果str1的字典序在str2之后,則返回0 | | `test $str1 \> $str2` | 如果str1的字典序在str2之前,則返回0 | | `test $str1` | 總是返回0 | | `test -n $str1` | 如果不為空返回0 | | `test -z $str1` | 如果是空串,返回0 | 關于字典序的那兩個比較,其實就是大于號`>`和小于號`<`。因為bash中這兩個符號有重定向的意思,所以這里要使用反斜杠`\` 轉義。 ~~~ #在bash中一個好的習慣就是在引用變量的時候加上雙引號。 ~~~ 比如下面: > **特別注意** 選項`-n`是 nonzero 的縮寫,理解為**長度不為0**。**但需要特別指出的是**:-n選項測試時請將引用變量外加上雙引號。 Bash中的引用變量的方法有很多種,我認為此處應該是加不加雙引號無所謂的。囧。。 經測試,如果我有當前未定義變量var(*或者定義為var=""*),那么理論上講,var就是空串。 `test -n $var`應該是返回1(假)的,因為他的長度是0。但其實此時無論var是否為空串都會返回真值0。 但是加上**雙引號**(注意不能是單引號),也就是`test -n "$var"`,效果就能如期,即只有在var為空的時候返回真值0。 而選項`-z`(是 zero 的縮寫,理解為**長度為0**)引用變量的時候加不加雙引號無所謂。 ## 測試文件 測試文件需要用到大量的選項,這里我只寫一個常用的,其他的大家自行`man test` ### 針對單個文件 | 選項 | 描述 | |-----|-----| | d | 是否為目錄 | | f | 是否為普通文件 | | x | 是否有執行權限 | | r | 是否有讀權限 | | w | 是否寫讀權限 | | e | 是否存在 | | s | 文件大小是否大于0 | | c | 是否為字符設備文件 | | b | 是否為塊設備文件 | 以上條件在成立的時候返回真值0。具體用法比如: ~~~ test -f hello.c test -d /home ~~~ ### 針對兩個文件 | 用法 | 描述 | |-----|-----| | test file1 -nt file2 | 測試file1的修改時間是不是比file2 new(新) | | test file1 -ot file2 | 測試file1的修改時間是不是比file2 old(舊) | | test file1 -ef file2 | 測試兩者是相同的設備和具有相同的結點(inode)數 | 同樣的,若是條件成立則返回真值0,否則返回假值1。注意這里的file1,file2就是文件名的字符串了。 ~~~ #可以直接test a.c -nt b.c #或者是 a=a.c b=b.c test $a -nt $b ~~~ 不再細表。 ## 邏輯運算 邏輯運算就是與或非。Bash中同樣有&&,||但是并非是在test內部,而是用來組合多條shell語句,前面我們應該看到過了,只有當&&前面的語句執行成功時,才執行后面的語句。而在test內部: | 運算符 | 描述 | |-----|-----| | -a | 邏輯與 | | -o | 邏輯或 | | ! | 邏輯非 | 用法如: ~~~ test $a -lt $b -a $a -gt $c test $a -lt $b -o $a -gt $c test ! -d sleep.sh && echo Yes #如果sleep.sh不是目錄,就打印Yes ~~~ 其實完整版是這樣: ~~~ test $a -lt $b -a test $a -gt $c test $a -lt $b -o test $a -gt $c ~~~ ## 簡化版test 在讀完這一部分后,你可能會驚呼,怎么不早點告訴我。哈哈。 其實以上所有的test命令都可以用方括號替換。比如 ~~~ test -f hello.c ~~~ 可以換成 ~~~ [ -f hello.c ] ~~~ 怎么樣,很方便吧。注意的是,方括號和表達式前后各有一個空格間隔哦。不要丟掉。實際也就是 [空格-f hello.c空格] 其他注意的地方是方括號的邏輯表達式,比如 ~~~ test $a -lt $b -a $a -gt $c ~~~ 可以轉化為 ~~~ [ $a -lt $b -a $a -lt $c ] ~~~ 另外有一操作符 [[ ]]支持使用 &&, ||來進行表達式的邏輯運算. [ ] 與 [[ ]]兩者具體差別請見:[http://www.cnblogs.com/include/archive/2011/12/09/2307905.html](http://www.cnblogs.com/include/archive/2011/12/09/2307905.html) > test是Shell的外部命令,而`[ ]`是Shell內置的操作符。 本系列(玩轉Bash腳本)更多文章,請訪問:[http://blog.csdn.net/column/details/wanbash.html](http://blog.csdn.net/column/details/wanbash.html)
                  <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>

                              哎呀哎呀视频在线观看