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