shell腳本應用(四)

  1. Shell環境根據命令執行後的返回狀態值($?)來判斷是否執行成功,當返回值爲0是表示成功,不然(非0值)表示失敗或者異常。使用專門的測試工具-test命令,能夠對特定條件進行測試,並根據返回值來判斷條件是否成立(返回值爲0時表示條件成立);
    ide


使用test測試命令時,包括如下兩種形式。
工具

test  條件表達式測試

或者spa

[ 條件表達式 ]server

這兩種方式的做用徹底相同,但一般後一種形式更爲經常使用,注意中括號括起來時至少要用一空格來分隔。內存


文件測試:
ci

文件測試的常見選項以下:字符串

-d:測試是否爲目錄(Directory)it

-e:測試目錄或文件是否存在(Exist)class

-f:測試是否爲文件(File)

-r:測試當前用戶是否有權限讀取(Read)

-w:測試當前用戶是否有權限寫入(Write)

-x:測試當前用戶是否有權限執行(EXcute)

執行條件測試後經過預約義變量「$?」能夠得到測試命令的返回狀態值。從而判斷條件是否成立。

例:執行下列操做可測試目錄/media/cdrom是否存在,若是返回值$?爲0,表示存在此目錄不然則不存在,或雖然存在但不是目錄。



[root@dbserver ~]# [ -d /media/cdrom ]


[root@dbserver ~]# echo $?    //查看當前一命令的返回值

1                             //返回1表示條件不成立

[root@dbserver ~]# [ -d /media ]

[root@dbserver ~]# echo $?     //查看當前一命令的返回值

0                                //返回0表示條件成立


 爲了更直觀的查看測試結果,能夠結合命令輸出符「&&」和echo命令一塊兒使用,當條件成立時直接輸出"yes",其中"&&"表示"並且"的關係,只有當前面的命令成功執行後纔會執行後面的命令,不然後面的命令將會被忽略。例:上面的測試結果能夠改成:


[root@dbserver ~]# [ -d /media/cdrom ]  && echo "yes"  //無輸出表示該目錄不存在

[root@dbserver ~]# [ -d /media ]  && echo "yes"       //輸出"yes"表示該目錄存在

yes


2.整數值得對比:整數值得比較指的是給定的兩個整數值,判斷第一個數與第二個數的關係,好比是否大於等於小於第二個數,整數值比較的經常使用選項以下。

-eq:第一個數等於第二個數

-ne:第一個數不等於第二個數

-gt:第一個數大於第二個數

-lt:第一個數小於第二個數

-le:第一個數小於或等於第二個數

-ge:第一個數大於等於第二個數

例:當判斷已經登錄的用戶,當小於五個時輸出"Too many",能夠執行如下操做。


[root@dbserver ~]# Unum=`who |wc -l`

[root@dbserver ~]# [ $Unum  -lt 5 ]  && echo "Too many"

Too many


再舉個例子,當內存大於1024MB時輸出如下值:


[root@dbserver ~]# FreeCC=$(free -m  | grep "cache:"  | awk  '{print $ 4}')

[root@dbserver ~]# [ $FreeCC -gt 1024 ] && echo ${FreeCC}MB

1648MB


4.字符串比較:字符串比較一般用於檢查用戶的輸入,系統環境等是否知足條件;

=:第一個字符串與第二個字符串相同;

!=:第一個字符串與第二個字符串不一樣,其中!表示取反;

-z:檢查字符串是否爲空值;

例:判斷當前的語言環境是否爲zh.CN;


[root@dbserver ~]# echo $LANG

en_US.UTF-8

[root@dbserver ~]# [ $LANG != "zh_CN" ]  && echo "not zh.CN"

not zh.CN


再例如,在Shell腳本應用中,常常輸入yes或者no來確認某個任務,如下操做展現了確認交互的簡單過程:


[root@dbserver ~]# read -p "是否覆蓋現有文件(yes/no)?" ACK

是否覆蓋現有文件(yes/no)?yes

[root@dbserver ~]# [ $ACK = "yes" ] && echo 「覆蓋」

「覆蓋」

[root@dbserver ~]# read -p "是否覆蓋現有文件(yes/no)?" ACK

是否覆蓋現有文件(yes/no)?no 

[root@dbserver ~]# [ $ACK = "no" ] && echo 不覆蓋

不覆蓋


4.邏輯測試:指的是判斷兩個或多個條件之間的依賴關係,當系統任務取決於多個不一樣的條件時,根據這些條件是否同時成立或者其中一個成立等狀況,須要一個測試的過程,經常使用的邏輯測試操做以下;

&&:邏輯與,表示「並且」,只有當先後兩個條件都成立時,整個測試命令的返回值才爲0(結果成立);

||:邏輯或,表示「或者」,只要當指定的條件不成立時,整個測試的返回值才爲0(結果成立),使用test命令測試時,||可改成"-o";

!:邏輯否,表示「不」,只有當條件不成立時,整個測試命令的返回值爲0(但結果是成立的);

例:若要判斷當前Linux系統內核版本是否大於2.4,可執行如下操做;


[root@dbserver ~]# uname -r

2.6.32-431.el6.x86_64

[root@dbserver ~]# Mnum=$(uname -r| awk -F. '{print $1}')

[root@dbserver ~]# Snum=$(uname -r| awk -F. '{print $2}')

[root@dbserver ~]# [ $Mnum -eq 2 ] && [ $Snum -gt 4 ]   && echo "符合要求"

符合要求


下次寫點if語句,我這都是基礎的,慢慢寫點難度大的,我就是個渣渣,哈哈

相關文章
相關標籤/搜索