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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Shell test命令(Shell [])详解,附带所有选项及说明

發布時間:2025/7/25 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Shell test命令(Shell [])详解,附带所有选项及说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

test 是?Shell?內置命令,用來檢測某個條件是否成立。test 通常和 if 語句一起使用,并且大部分 if 語句都依賴 test。

test 命令有很多選項,可以進行數值、字符串和文件三個方面的檢測。

Shell test 命令的用法為:

test expression

當 test 判斷 expression 成立時,退出狀態為 0,否則為非 0 值。

test 命令也可以簡寫為[],它的用法為:

[ expression ]

注意[]和expression之間的空格,這兩個空格是必須的,否則會導致語法錯誤。[]的寫法更加簡潔,比 test 使用頻率高。

test 和 [] 是等價的,后續我們會交替使用 test 和 [],以讓讀者盡快熟悉。

在《Shell if else》中,我們使用 (()) 進行數值比較,這節我們就來看一下如何使用 test 命令進行數值比較。

  • #!/bin/bash
  • read age
  • if test $age -le 2; then
  • echo "嬰兒"
  • elif test $age -ge 3 && test $age -le 8; then
  • echo "幼兒"
  • elif [ $age -ge 9 ] && [ $age -le 17 ]; then
  • echo "少年"
  • elif [ $age -ge 18 ] && [ $age -le 25 ]; then
  • echo "成年"
  • elif test $age -ge 26 && test $age -le 40; then
  • echo "青年"
  • elif test $age -ge 41 && [ $age -le 60 ]; then
  • echo "中年"
  • else
  • echo "老年"
  • fi
  • 其中,-le選項表示小于等于,-ge選項表示大于等于,&&是邏輯與運算符。

    學習 test 命令,重點是學習它的各種選項,下面我們就逐一講解。

    1) 與文件檢測相關的 test 選項

    表1:test 文件檢測相關選項列表文件類型判斷選 項作 用文件權限判斷選 項作?用文件比較選 項作?用
    -b filename判斷文件是否存在,并且是否為塊設備文件。
    -c filename判斷文件是否存在,并且是否為字符設備文件。
    -d filename判斷文件是否存在,并且是否為目錄文件。
    -e filename判斷文件是否存在。
    -f filename判斷文件是否存在,井且是否為普通文件。
    -L filename判斷文件是否存在,并且是否為符號鏈接文件。
    -p?filename判斷文件是否存在,并且是否為管道文件。
    -s filename判斷文件是否存在,并且是否為非空。
    -S filename判斷該文件是否存在,并且是否為套接字文件。
    -r filename判斷文件是否存在,并且是否擁有讀權限。
    -w filename判斷文件是否存在,并且是否擁有寫權限。
    -x filename判斷文件是否存在,并且是否擁有執行權限。
    -u filename判斷文件是否存在,并且是否擁有 SUID 權限。
    -g filename判斷文件是否存在,并且是否擁有 SGID 權限。
    -k filename判斷該文件是否存在,并且是否擁有 SBIT 權限。
    filename1 -nt filename2判斷 filename1 的修改時間是否比 filename2 的新。
    filename -ot filename2判斷 filename1 的修改時間是否比 filename2 的舊。
    filename1 -ef filename2判斷 filename1 是否和 filename2 的 inode 號一致,可以理解為兩個文件是否為同一個文件。這個判斷用于判斷硬鏈接是很好的方法


    Shell test 文件檢測舉例:

  • #!/bin/bash
  • read filename
  • read url
  • if test -w $filename && test -n $url
  • then
  • echo $url > $filename
  • echo "寫入成功"
  • else
  • echo "寫入失敗"
  • fi
  • 在?Shell 腳本文件所在的目錄新建一個文本文件并命名為 urls.txt,然后運行 Shell 腳本,運行結果為:
    urls.txt↙
    http://c.biancheng.net/shell/↙
    寫入成功

    2) 與數值比較相關的 test 選?項

    表2:test 數值比較相關選項列表選 項作?用
    num1 -eq num2判斷 num1 是否和 num2 相等。
    num1 -ne num2判斷 num1 是否和 num2 不相等。
    num1 -gt num2判斷 num1 是否大于 num2 。
    num1 -lt num2判斷 num1 是否小于 num2。
    num1 -ge num2判斷 num1 是否大于等于 num2。
    num1 -le num2判斷 num1 是否小于等于 num2。


    注意,test 只能用來比較整數,小數相關的比較還得依賴?bc 命令。

    Shell test 數值比較舉例:

  • #!/bin/bash
  • read a b
  • if test $a -eq $b
  • then
  • echo "兩個數相等"
  • else
  • echo "兩個數不相等"
  • fi
  • 運行結果1:
    10 10
    兩個數相等

    運行結果2:
    10 20
    兩個數不相等

    3) 與字符串判斷相關的 test 選項

    表3:test 字符串判斷相關選項列表選 項作?用
    -z str判斷字符串 str 是否為空。
    -n str判斷宇符串 str 是否為非空。
    str1 = str2
    str1 == str2
    =和==是等價的,都用來判斷 str1 是否和 str2 相等。
    str1 != str2判斷 str1 是否和 str2 不相等。
    str1 \> str2判斷 str1 是否大于 str2。\>是>的轉義字符,這樣寫是為了防止>被誤認為成重定向運算符。
    str1 \< str2判斷 str1 是否小于 str2。同樣,\<也是轉義字符。


    有C語言、C++、Python、Java?等編程經驗的讀者請注意,==、>、< 在大部分編程語言中都用來比較數字,而在 Shell 中,它們只能用來比較字符串,不能比較數字,這是非常奇葩的,大家要習慣。

    其次,不管是比較數字還是字符串,Shell 都不支持 >= 和 <= 運算符,切記。

    Shell test 字符串比較舉例:

  • #!/bin/bash
  • read str1
  • read str2
  • #檢測字符串是否為空
  • if [ -z "$str1" ] || [ -z "$str2" ]
  • then
  • echo "字符串不能為空"
  • exit 0
  • fi
  • #比較字符串
  • if [ $str1 = $str2 ]
  • then
  • echo "兩個字符串相等"
  • else
  • echo "兩個字符串不相等"
  • fi
  • 運行結果:
    http://c.biancheng.net/
    http://c.biancheng.net/shell/
    兩個字符串不相等

    細心的讀者可能已經注意到,變量 $str1 和 $str2 都被雙引號包圍起來,這樣做是為了防止 $str1 或者 $str2 是空字符串時出現錯誤,本文的后續部分將為你分析具體原因。

    4) 與邏輯運算相關的 test 選項

    表4:test 邏輯運算相關選項列表選 項作?用
    expression1 -a expression邏輯與,表達式 expression1 和 expression2 都成立,最終的結果才是成立的。
    expression1 -o expression2邏輯或,表達式 expression1 和 expression2 有一個成立,最終的結果就成立。
    !expression邏輯非,對 expression 進行取反。


    改寫上面的代碼,使用邏輯運算選項:

  • #!/bin/bash
  • read str1
  • read str2
  • #檢測字符串是否為空
  • if [ -z "$str1" -o -z "$str2" ] #使用 -o 選項取代之前的 ||
  • then
  • echo "字符串不能為空"
  • exit 0
  • fi
  • #比較字符串
  • if [ $str1 = $str2 ]
  • then
  • echo "兩個字符串相等"
  • else
  • echo "兩個字符串不相等"
  • fi
  • 前面的代碼我們使用兩個[]命令,并使用||運算符將它們連接起來,這里我們改成-o選項,只使用一個[]命令就可以了。

    在 test 中使用變量建議用雙引號包圍起來

    test 和 [] 都是命令,一個命令本質上對應一個程序或者一個函數。即使是一個程序,它也有入口函數,例如C語言程序的入口函數是 main(),運行C語言程序就從 main() 函數開始,所以也可以將一個程序等效為一個函數,這樣我們就不用再區分函數和程序了,直接將一個命令和一個函數對應起來即可。

    有了以上認知,就很容易看透命令的本質了:使用一個命令其實就是調用一個函數,命令后面附帶的選項和參數最終都會作為實參傳遞給函數。

    假設 test 命令對應的函數是 func(),使用test -z $str1命令時,會先將變量 $str1 替換成字符串:

    • 如果 $str1 是一個正常的字符串,比如 abc123,那么替換后的效果就是test -z abc123,調用 func() 函數的形式就是func("-z abc123")。test 命令后面附帶的所有選項和參數會被看成一個整體,并作為實參傳遞進函數。
    • 如果 $str1 是一個空字符串,那么替換后的效果就是test -z,調用 func() 函數的形式就是func("-z "),這就比較奇怪了,因為-z選項沒有和參數成對出現,func() 在分析時就會出錯。


    如果我們給 $str1 變量加上雙引號,當 $str1 是空字符串時,test -z "$str1"就會被替換為test -z "",調用 func() 函數的形式就是func("-z \"\""),很顯然,-z選項后面跟的是一個空字符串(\"表示轉義字符),這樣 func() 在分析時就不會出錯了。

    所以,當你在 test 命令中使用變量時,我強烈建議將變量用雙引號""包圍起來,這樣能避免變量為空值時導致的很多奇葩問題。

    總結

    test 命令比較奇葩,>、<、== 只能用來比較字符串,不能用來比較數字,比較數字需要使用 -eq、-gt 等選項;不管是比較字符串還是數字,test 都不支持 >= 和 <=。有經驗的程序員需要慢慢習慣 test 命令的這些奇葩用法。

    對于整型數字的比較,我建議大家使用 (()),這在《Shell if else》中已經進行了演示。(()) 支持各種運算符,寫法也符合數學規則,用起來更加方便,何樂而不為呢?

    幾乎完全兼容 test ,并且比 test 更加強大,比 test 更加靈活的是[[ ]];[[ ]]不是命令,而是 Shell 關鍵字,下節《Shell [[]]》我們將會講解

    Shell test命令(Shell [])詳解,附帶所有選項及說明

    轉載于:https://www.cnblogs.com/qiangyuzhou/p/10806667.html

    總結

    以上是生活随笔為你收集整理的Shell test命令(Shell [])详解,附带所有选项及说明的全部內容,希望文章能夠幫你解決所遇到的問題。

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