shell指令碼應用(四)

2021-09-29 08:35:35 字數 3007 閱讀 4499

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

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

test  條件表示式

或者[ 條件表示式 ]

這兩種方式的作用完全相同,但通常後一種形式更為常用,注意中括號括起來時至少要用一空格來分隔。

檔案測試:

檔案測試的常見選項如下:

-d:測試是否為目錄(directory)

-e:測試目錄或檔案是否存在(exist)

-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"表示該目錄存在

yes2.整數值得對比:整數值得比較指的是給定的兩個整數值,判斷第乙個數與第二個數的關係,比如是否大於等於小於第二個數,整數值比較的常用選項如下。

-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  '')

[root@dbserver ~]# [ $freecc -gt 1024 ] && echo $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. '')

[root@dbserver ~]# snum=$(uname -r| awk -f. '')

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

符合要求

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

shell指令碼應用(四)

正則 基礎正則 word 搜尋以word開頭的 vi vim中 一行的開頭 word 搜尋以word結尾的 vi vim中 一行的結尾 表示空行 代表且只能代表任意乙個字元 例 只代表點本身,轉義符號,讓有特殊身份意義的字元,脫掉馬甲,還原 n 換行符 r 匹配回車 w 匹配任意乙個字元和數字 重複...

Shell指令碼應用

shell script shell指令碼與windows dos下的批處理相似,也就是用各類命令預先放入到乙個檔案中,方便一次性執行的乙個程式檔案,主要是方便管理員進行設定或者管理用的。但是它比windows下的批處理更強大,比用其他程式設計程式編輯的程式效率更高,它使用了linux unix下的...

shell指令碼基本應用

chmod x hello.sh 給檔案增加執行許可權 hello.sh 執行指令碼 sh hello.sh 以sh執行指令碼 bash hello.sh 以bash執行指令碼 source hello.sh 以source執行指令碼,該指令碼檔案可以無 執行許可權 if有三種表示式 1.if fi...