shell判定一个变量等于-n_Shell test命令:条件判断,检查某条件是否成立
test 命令是 Bash 中重要的判斷命令,也是 Shell 腳本中條件判斷的重要輔助工具。當我們需要讓程序自動判斷哪些事情是成立的時,test 命令就派上用場了。
按照文件類型進行判斷
根據表 1,我們先來看看 test 可以進行哪些文件類型的判斷。
表 1 文件類型判斷
測試選項
作 用
-b 文件
判斷該文件是否存在,并且是否為塊設備文件(是塊設備文件為真)
-c 文件
判斷該文件是否存在,并且是否為字符設備文件(是字符設備文件為真)
-d 文件
判斷該文件是否存在,并且是否為目錄文件(是目錄文件為真)
-e 文件
判斷該文件是否存在(存在為真)
-f 文件
判斷該文件是否存在,井且是否為普通文件(是普通文件為真)
-L 文件
判斷該文件是否存在,并且是否為符號鏈接文件(是符號鏈接文件為真〉
-p?文件
判斷該文件是否存在,并且是否為管道文件(是管道文件為真)
-s 文件
判斷該文件是否存在,并且是否為非空(非空為真)
-S 文件
判斷該文件是否存在,并且是否為套接字文件(是套接字文件為真〉
光看這張表是完全不知道該怎么操作的,我們來舉個例子吧。先來判斷一下我們存放腳本的目錄 /root/sh/ 是否存在,命令如下:
[root@localhost ~]# test -e /root/sh/
這條命令也可以這樣寫:
[root@localhost ~]# [-e /root/sh/]
它們的作用是一樣的,推薦使用"[]"方式。因為在腳本的條件語句中主要應用這種方式。兩條命令執行完后是沒有任何結果的。不過要注意,如果使用"[]"方式,則在"[]"的內部和數據之間必須使用空格;否則判斷式會報錯。
其實 test 命令就是這樣的,但是我們該如何判斷這條命令的執行是否正確呢?還記得"$?"預定義變量嗎?就是看這個變量的值,如果變量值為 0,則代表 test 判斷為真;如果變量值非 0,則代表 test 判斷為假。例如:
[root@localhost ~]# [-e /root/sh/]
[root@localhost ~]# echo $?
0
#判斷結果為0,/root/sh/目錄是存在的
[root@localhost ~]# [-e /root/test]
[root@localhost ~]# echo $?
1
#在/root/下并沒有test文件或目錄,所以"$?"的返回值為非0
不過這樣查看命令的結果非常麻煩,也不直觀。還記得多命令順序執行符"&&"和"||"嗎?我們可以再判斷一下 /root/sh/ 是否是目錄,命令如下:
[root@localhost ~]# [-d /root/sh] && echo "yes"||echo "no"
#第一條判斷命令如果正確執行,則打印"yes"; 否則打印"no"
yes
這樣就直觀多了,不過也并不方便。等我們學習了條件判斷,就會知道 test 判斷到底用在明哩,現在就先這樣吧。
按照文件權限進行判斷
test 是非常完善的判斷命令,還可以判斷文件的權限,我們通過表 2 來看看。
表 2 文件權限判斷
測試選項
作?用
-r 文件
判斷該文件是否存在,并且是否擁有讀權限(有讀權限為真)
-w 文件
判斷該文件是否存在,并且是否擁有寫權限(有寫權限為真)
-x 文件
判斷該文件是否存在,并且是否擁有執行權限(有執行權限為真)
-u 文件
判斷該文件是否存在,并且是否擁有SUID權限(有SUID權限為真)
-g 文件
判斷該文件是否存在,并且是否擁有SG1D權限(有SGID權限為真)
-k 文件
判斷該文件是否存在,并且是否擁有SBIT權限(有SBIT權限為真)
在使用 test 命令判斷權限時,并不能區分所有者、屬組和其他人。只要文件擁有權限,test 判斷就為真,而不能區分哪個用戶身份擁有權限。比如:
[root@localhost ~]# ll student.txt
-rw-r--r--. 1 root root 97 6月7 07:34 student.txt
[root@localhost ~]# [-w student.txt] && echo "yes"||echo "no"
yes
#判斷文件是擁有寫權限的
雖然 student.txt 文件只有所有者擁有寫權限,但在用 test 判斷時,是不能區分身份的,只要擁有寫權限就返回真。
兩個文件之間進行比較
通過表 3 來看看如何進行兩個文件之間的比較。
表 3 兩個文件之間進行比較
測試選項
作?用
文件 1 -nt文件 2
判斷文件1的修改時間是否比文件2的新(如果新則為真)
文件 1 *ot文件 2
判斷文件1的修改時間是否比文件2的舊(如果舊則為真)
文件 1?-ef 文件 2
判斷文件1是否和文件2的inode號一致,可以理解為兩個文件是否為同一個文件。這個 判斷用于判斷硬鏈接是很好的方法
我們一直很苦惱,到底該如何判斷兩個文件是否是硬鏈接呢?這時 test 就派上用場了,命令如下:
[root@localhost ~]# ln /root/student.txt /tmp/stu.txt
#創建一個硬鏈接
[root@localhost ~]# [/root/student.txt -ef/tmp/stu.txt] && echo "yes" || echo "no"
yes
#用test測試一下,果然很有用
兩個整數之間進行比較
通過表 4 來學習一下如何在兩個整數之間進行比較。
表 4 兩個整數之間進行比較
測試選項
作?用
整數1 -eq 整數 2
判斷整數 1 是否和整數 2 相等(相等為真)
整數1 -ne 整數 2
判斷整數 1 是否和整數 2 不相等(不相等為真)
整數1 -gt 整數 2
判斷整數 1 是否大于整數 2 (大于為真)
整數1 -lt 整數 2
判斷整數 1 是否小于整數 2(小于為真)
整數1 -ge 整數 2
判斷整數 1 是否大于等于整數 2 (大于等于為真)
整數1 -le 整數 2
判斷整數 1 是否小于等于整數 2(小于等于為真)
舉個例子:
[root@localhost ~]# [23 -ge 22] && echo "yes"||echo "no"
yes
#判斷23是否大于等于22,當然是了
[root@localhost ~】# [23 -le 22] && echo "yes"||echo "no"
no
#判斷23是否小于等于22,當然不是了
字符串判斷
通過表 5 來學習一下字符串判斷。
表 5 字符串判斷
測試選項
作?用
-z 字符串
判斷字符串是否為空(為空返回真)
-n 字符串
判斷宇符串是否為非空(非空返回真)
字串 1 = 字串 2
判斷字符串 1 是否和字符串 2 相等(相等返回真)
字串 1 != 字串 2
判斷字符串 1 是否和字符串 2 不相等(不相等返回真)
舉個例子:
[root@localhost ~]# name=sc
#給name變量賦值
[root@localhost ~]# [-z "$name"] && echo "yes" || echo"no"
no
#判斷name變量是否為空,因為不為空,所以返回no
再來看看如何判斷兩個字符串相等,命令如下:
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#給變量aa和bb賦值
[root@localhost ~]#["$aa"=="bb"] && echo "yes" || echo "no"
no
#判斷兩個變量的值是否相等,明顯不相等,所以 返回no
多重條件判斷
通過表 6 來看看多重條件判斷是什么樣子的。
表 6 多重條件判斷
測試選項
作?用
判斷 1 -a 判斷 2
邏輯與,判斷 1 和判斷 2 都成立,最終的結果才為真
判斷 1 -o 判斷 2
邏輯或,判斷 1 和判斷 2 有一個成立,最終的結果就為真
! 判斷
邏輯非,使原始的判斷式取反
舉個例子:
[root@localhost ~]# aa=11
#給變量aa賦值
[root@localhost ~]# [-n "$aa" -a "$aa" -gt 23] && echo "yes" || echo "no"
no
#判斷變量aa是否有值,同時判斷變量aa的值是否大于23
#因為變量aa的值不大于23,所以雖然第一個判斷值為真,但返回的結果是假
要想讓剛剛的判斷式返回真,需要給變量 aa 重新賦一個大于 23 的值,命令如下:
[root@localhost ~]# aa=24
[root@localhost ~]# [-n "$aa" -a "$aa" -gt 23] && echo "yes" || echo "no" yes
再來看看邏輯非是什么樣子的,命令如下:
[root@localhost ~]# [! -n "$aa"] && echo "yes" || echo "no"
no
#本來"-n"選項是變量aa不為空,返回值就是真
#加入"!"之后,判斷值就會取反,所以當變量aa有值時,返回值是假
注意,"!"和"-n"之間必須加入空格,否則會報錯。
總結
以上是生活随笔為你收集整理的shell判定一个变量等于-n_Shell test命令:条件判断,检查某条件是否成立的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中os模块_Python的武
- 下一篇: 安卓抓包软件_Packet Captur