天天看點

BASH 比較運算小結

【小蝸牛五二無聊之作】

    網絡上能找到的相關資料太多了,也太繁雜,但有些人還整理得不錯,下面根據自己的偏好再梳理一下,有些是自己對照着man手冊翻譯的,下面的例子都是自己編造自己測試OK,都是比較實用的東西,友善自己日後參考。

1、算術運算比較運算符(bash自身不能比較浮點數)

-eq 等于          [ $num1 -eq $num2 ]

-ne 不等于       [ 100   -ne $num1 ]

-lt 小于           [ 100   -lt `expr $num1 + $num2` ]

-le 小于或等于   [ 100   -le `expr $num1 \* $num2` ]

-gt 大于           [ 100   -gt `expr $num1 / $num2` ]

-ge 大于或等于   [ 100   -ge `expr $num1 % $num2` ]

2、字元串比較運算符  

-z string  如果 string 長度為零,則為真  [ -z "`ps aux | grep mysql`" ]

-n string  如果 string 長度非零,則為真  [ -n "$string" ]

              【注意】 $string 一定要放在雙引号裡面 "$string",否則使用 -n -z 的結果都為真!

string1 != string2  如果 string1 與 string2 不同,則為真  [ "$str1" != "Snail" ]

string1 == string2  如果 string1 與 string2 相同,則為真  [ "$str1" == "$str2" ]

                    (上面用一個 = 也可以,在嚴格的 POSIX 相容下使用)

string1 < string2   如果 string1 按字典順序比較小于 string2,則為真

string1 > string2   如果 string1 按字典順序比較大于 string2,則為真

3、檔案比較運算符 

-a filename  如果 filename 存在,則為真                   [ -e $HOME/.bashrc ]

-e filename  (同上)

-b filename  如果 filename 存在,并且是塊檔案,則為真     [ -e /dev/loop0 ]

-c filename  如果 filename 存在,并且是字元檔案,則為真   [ -e /dev/ttyS0 ]

-d filename  如果 filename 存在,并且為目錄,則為真       [ -d /home/snail ]

-f filename  如果 filename 存在,并且為正常檔案,則為真   [ -f /dev/ttyS0 ]

-g filename  如果 filename 存在,并且為set-group-id,為真 [ -f $HOME/ak47 ]

-h filename  如果 filename 存在,并且為符号連接配接,則為真   [ -h /bin/vi ]

-L filename  (同上)

-k filename  如果 filename 存在,并且設定了sticky位,為真 [ -k /bin/ping ]

-p filename  如果 filename 存在,并且為有名管道(FIFO),真 [ -p /tmp/pipe ]

-r filename  如果 filename 存在,并且可讀,則為真         [ -r /etc/passwd ]

-s filename  如果 filename 存在,并且大小不為零,為真     [ -s ./none-zero ]

-u filename  如果 filename 存在,并且為set-user-id,為真  [ -f $HOME/ak47 ]      

-w filename  如果 filename 存在,并且可寫,則為真         [ -w /var/log/mail ]

-x filename  如果 filename 存在,并且可執行,則為真       [ -x ./start.sh ]

下面這些不常用的:

-t fd        如果檔案描述符被打開并指向一個終端,則為真   [ -t /proc/1/fd/10 ]

              【提示】在 /proc/程序号/fd 下可以找到檔案描述符:)

-O filename  如果 filename 存在,并且被有效使用者ID所擁有,則為真

-G filename  如果 filename 存在,并且被有效組ID所擁有,則為真

-S filename  如果 filename 存在,并且為一個socket,則為真 [ -S /tmp/mysql.sock ]

-N filename  如果 filename 存在,并且在上次讀取後被修改過,則為真

-o optname   如果 shell 選項 optname 被開啟,則為真

              【提示】使用 set -o 來檢視

file1 -nt file2  如果 file1 比 file2 新,或者 file1 存在 file2 不存在,則為真

file1 -ot file2  如果 file1 比 file2 舊,或者 file2 存在 file1 不存在,則為真

file1 -ef file2  如果 file1 和 file2 都指向同樣的裝置(device)和索引節點号(inode numbers),則為真

              【提示】檢視檔案的索引節點可以用 ls -i 選項

------------------------------------------------------------------------------------------

趙小蝸牛

QQ: 755721501

E-mail: [email][email protected][/email]

在不斷奉獻中謀求生存發展、打造自己的優秀品質,用人性最本質最動人的一面“營銷”自己!

繼續閱讀