IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁操作系統(tǒng)LINUX → 鳥哥Linux私房菜之學(xué)習(xí)Shell Scripts(2)

鳥哥Linux私房菜之學(xué)習(xí)Shell Scripts(2)

時(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)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP Linux操作系統(tǒng)修改IP

相關(guān)下載

    人氣排行 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ù)載