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

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

鳥哥Linux私房菜之學習Shell Scripts(2)

時間: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

相關閱讀

文章評論
發(fā)表評論

熱門文章 安裝紅帽子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

相關下載

    人氣排行 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讀寫負載