時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)
善用判斷式
在 bash 章節(jié)中,我們提到過 $? 這個變量所代表的意義, 此外,也透過 && 及 || 來作為前一個指令是否能夠成功進行的一個參考。 那么,如果我想要知道 /dmtsai 這個目錄是否存在時,難道一定要使用 ls 來執(zhí)行, 然后再以 $? 來判斷執(zhí)行成果嗎?呵呵!當然不需要! 我們可以透過『 test 』這個指令來偵測呢!
--------------------------------------------------------------------------------
利用 test 指令的測試功能
當我要檢測系統(tǒng)上面某些檔案或者是相關的屬性時,利用 test 這個指令來工作, 真是好用得不得了,舉例來說,我要檢查 /dmtsai 是否存在時,使用:
[root@linux ~]# test -e /dmtsai
執(zhí)行結果并不會顯示任何訊息,但最后我們可以透過 $? 或 && 及 || 來展現(xiàn)整個結果呢! 例如我們在將上面的例子改寫成這樣:
[root@linux ~]# test -e /dmtsai && echo "exist" || echo "Not exist"
最終的結果可以告知我們是『exist』還是『Not exist』呢!那我知道 -e 是測試一個『東西』在不在, 如果還想要測試一下該檔名是啥玩意兒時,還有哪些標志可以來判斷的呢?呵呵!有底下這些東西喔!
測試的標志 代表意義
1. 關于某個檔名的『類型』偵測(存在與否),如 test -e filename
-e 該『檔名』是否存在?(常用)
-f 該『檔名』是否為檔案(file)?(常用)
-d 該『文件名』是否為目錄(directory)?(常用)
-b 該『檔名』是否為一個 block device 裝置?
-c 該『檔名』是否為一個 character device 裝置?
-S 該『檔名』是否為一個 Socket 檔案?
-p 該『檔名』是否為一個 FIFO (pipe) 檔案?
-L 該『檔名』是否為一個連結檔?
2. 關于檔案的權限偵測,如 test -r filename
-r 偵測該檔名是否具有『可讀』的屬性?
-w 偵測該檔名是否具有『可寫』的屬性?
-x 偵測該檔名是否具有『可執(zhí)行』的屬性?
-u 偵測該文件名是否具有『SUID』的屬性?
-g 偵測該文件名是否具有『SGID』的屬性?
-k 偵測該文件名是否具有『Sticky bit』的屬性?
-s 偵測該檔名是否為『非空白檔案』?
3. 兩個檔案之間的比較,如: test file1 -nt file2
-nt (newer than)判斷 file1 是否比 file2 新
-ot (older than)判斷 file1 是否比 file2 舊
-ef 判斷 file2 與 file2 是否為同一檔案,可用在判斷 hard link 的判定上。 主要意義在判定,兩個檔案是否均指向同一個 inode 哩!
4. 關于兩個整數(shù)之間的判定,例如 test n1 -eq n2
-eq 兩數(shù)值相等 (equal)
-ne 兩數(shù)值不等 (not equal)
-gt n1 大于 n2 (greater than)
-lt n1 小于 n2 (less than)
-ge n1 大于等于 n2 (greater than or equal)
-le n1 小于等于 n2 (less than or equal)
5. 判定字符串的數(shù)據(jù)
test -z string 判定字符串是否為 0 ?若 string 為空字符串,則為 true
test -n string 判定字符串是否非為 0 ?若 string 為空字符串,則為 false。
注: -n 亦可省略
test str1 = str2 判定 str1 是否等于 str2 ,若相等,則回傳 true
test str1 != str2 判定 str1 是否不等于 str2 ,若相等,則回傳 false
6. 多重條件判定,例如: test -r filename -a -x filename
-a (and)兩狀況同時成立!例如 test -r file -a -x file,則 file 同時具有 r 與 x 權限時,才回傳 true。
-o (or)兩狀況任何一個成立!例如 test -r file -o -x file,則 file 具有 r 或 x 權限時,就可回傳 true。
! 反相狀態(tài),如 test ! -x file ,當 file 不具有 x 時,回傳 true
OK!現(xiàn)在我們就利用 test 來幫我們寫幾個簡單的例子。首先,判斷一下, 讓使用者輸入一個檔名,我們判斷:
#p#副標題#e#
這個檔案是否存在,若不存在則給予一個『Filename does not exist』的訊息,并中斷程序;
若這個檔案存在,則判斷他是個檔案或目錄,結果輸出『Filename is regular file』或 『Filename is directory』
判斷一下,執(zhí)行者的身份對這個檔案或目錄所擁有的權限,并輸出權限數(shù)據(jù)!
你可以先自行創(chuàng)作看看,然后再跟底下的結果討論討論。注意利用 test 與 && 還有 || 等標志!
[root@linux scripts]# vi sh05.sh
#!/bin/bash
# Program:
# Let user input a filename, the program will search the filename
#? 1.) exist? 2.) file/directory? 3.) file permissions
# History:
# 2005/08/25? VBird? First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# 1. 讓使用者輸入檔名,并且判斷使用者是否真的有輸入字符串?
echo -e "The program will show you that filename is exist which input by you. "
read -p "Input a filename : " filename
test -z $filename && echo "You MUST input a filename." && exit 0
# 2. 判斷檔案是否存在?
test ! -e $filename && echo "The filename $filename DO NOT exist" && exit 0
# 3. 開始判斷檔案類型與屬性
test -f $filename && filetype="regulare file"
test -d $filename && filetype="directory"
test -r $filename && perm="readable"
test -w $filename && perm="$perm writable"
test -x $filename && perm="$perm executable"
# 4. 開始輸出信息!
echo "The filename: $filename is a $filetype"
echo "And the permission are : $perm"
很有趣的例子吧!您可以自行再以其它的案例來撰寫一下可用的功能呢!
--------------------------------------------------------------------------------
利用判斷符號 [ ]
除了我們很喜歡使用的 test 之外,其實,我們還可以利用判斷符號『 [ ] 』來進行數(shù)據(jù)的判斷呢! 舉例來說,如果我想要知道 $HOME 這個變量是否為空的,可以這樣做:
[root@linux ~]# [ -z "$HOME" ]
但使用 [] 要特別注意的是,在上述的每個組件中間都需要有空格鍵來分隔,假設我空格鍵使用『□』來表示, 那么,在這些地方你都需要有空格鍵:
[? "$HOME"? ==? "$MAIL"? ]
[□"$HOME"□==□"$MAIL"□]
↑ ↑? ↑ ↑
上面的例子在說明,兩個字符串 $HOME 與 $MAIL 是否相同的意思,相當于 test $HOME = $MAIL 的意思啦! 而如果沒有空白分隔,例如 [$HOME==$MAIL] 時,我們的 bash 就會顯示錯誤訊息了!這可要很注意??! 所以說,您最好要注意:
在中括號 [] 內的每個組件都需要有空格鍵來分隔;
在中括號內的變量,最好都以雙引號來設定;
在中括號內的常數(shù),最好都以單或雙引號來設定。
舉例來說,假如我設定了 name="VBird Tsai" ,然后這樣判定:
[root@linux ~]# name="VBird Tsai"
[root@linux ~]# [ $name == "VBird" ]
bash: [: too many arguments
為什么呢?因為 $name 如果沒有使用雙引號刮起來,那么上面的判定式會變成:
[ VBird Tsai == "VBird" ]
而不是我們要的:
[ "VBird Tsai" == "VBird" ]
這可是差很多的喔!另外,中括號的使用方法與標志與 test 幾乎一模一樣啊~ 只是中括號比較常用在條件判斷式 if ..... then ..... fi 的情況中就是了。 好,那我們也繼續(xù)來做一個小案例好了:
當執(zhí)行一個程序的時候,這個程序會讓使用者選擇 Y 或 N ,
如果使用者輸入 Y 或 y 時,就顯示『 OK, continue 』
如果使用者輸入 n 或 N 時,就顯示『 Oh, interrupt !』
如果不是 Y/y/N/n 之內的其它字符,就顯示『I don't know what is your choise』
利用中括號、 && 與 || 來繼續(xù)吧!
#p#副標題#e#
[root@linux scripts]# vi sh06.sh
#!/bin/bash
# Program:
# This program will show the user's choice
# History:
# 2005/08/25? VBird???
關鍵詞標簽:Linux,Shell Scripts
相關閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP
人氣排行 Linux下獲取CPUID、硬盤序列號與MAC地址 dmidecode命令查看內存型號 linux tc實現(xiàn)ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關機、重啟、注銷 命令 查看linux服務器硬盤IO讀寫負載