shell腳本學習—條件測試和循環語句


   條件測試

  1. 條件測試:test [

  命令test或[可以測試一個條件是否成立,如果測試結果為真,則該命令的Exit Status為0,如果測試結果為假,

  則命令的Exit Status為1(注意與C語⾔言的邏輯表⽰示正好相反)。例如測試兩個數的大小關系:

 

 

 雖然看起來很奇怪,但左方括號[確實是一個命令的名字,傳給命令的各參數之間應該⽤空格隔
開,比如,$VAR、-gt、3、]是[命令的四個參數,它們之間必須⽤空格隔開。命令test或[的參數
形式是相同的,只不過test命令不需要]參數。以[命令為例,常見的測試命令如下表所示:

測試命令

[ -d DIR ] : 如果DIR存在並且是一個目錄則為真
[ -f FILE ] : 如果FILE存在且是一個普通文件則為真
[ -z STRING ] : 如果STRING的長度為零則為真
[ -n STRING ] : 如果STRING的長度非零則為真
[ STRING1 = STRING2 ] : 如果兩個字符串相同則為真
[ STRING1 != STRING2 ] : 如果字符串不相同則為真

OP是-eq(等於)- ne(不等於)-lt(⼩小於)-le(⼩小於等於)-gt(⼤大於)-ge(⼤大於等 於)之中的⼀一個 (整數判斷和C語⾔言有很⼤大差別)。

和C語言類似,測試條件之間還可以做與、或、⾮非邏輯運算:

帶與、或、非的測試命令
[ ! EXPR ] : EXPR可以是上表中的任意一種測試條件,!表示邏輯反
[ EXPR1 -a EXPR2 ] : EXPR1和EXPR2可以是上表中的任意一種測試條件,-a表⽰示邏輯與
[ EXPR1 -o EXPR2 ] :EXPR1和EXPR2可以是上表中的任意一種測試條件,-o表示邏輯或

例如:

 

 

2. if/then/elif/else/fi

 和C語言類似,在Shell中用if、then、elif、else、fi這⼏條命令實現分支控制。這種流程控制語
 句本質上也是由若干條Shell命令組成的

 其實是三條命令,if [ -f ~/.bashrc ]是第一條,then . ~/.bashrc是第二條,fi是第三條。如果兩條
 命令寫在同一行則需要用;號隔開,一行只寫一條命令就不需要寫;號了,另外,then后面有換行,
 但這條命令沒寫完,Shell會自動續行,把下一行接在then后面當作一條命令處理。和[命令一
 樣,要注意命令和各參數之間必須用空格隔開。if命令的參數組成一條子命令,如果該子命令
 的Exit Status為0(表⽰示真),則執行then后面的子命令,如果Exit Status非0(表⽰示假),則執行
 elif、else或者fi后面的子命令。if后面的子命令通常是測試命令,但也可以是其它命令。
 Shell腳本沒有{}括號,所以用fi表示if語句塊的結束。見下例:

 

 

:是一個特殊的命令,稱為空命令,該命令不做任何事,但Exit Status總是真。此外,也可以執行
/bin/true或/bin/false得到真或假的Exit Status。
此外,Shell還提供了&&和||語法,和C語言類似,具有Short-circuit特性,很多Shell腳本喜歡寫成

 

 

 

 

 

&&相當於“if...then...”,而||相當於“if not...then...”。&&和||用於連接兩個命令,⽽上⾯講的-a
和-o僅 ⽤用於在測試表達式中連接兩個測試條件,要注意它們的區別,例如,

 

 

兩種寫法等價,但是有區別!!

3. case/esac

case命令可類比C語言的switch/case語句,esac表示case語句塊的結束。C語⾔的case只能匹配
整型或字符型常量表達式,而Shell腳本的case可以匹配字符串和Wildcard,每個匹配分支可
以有若干條命令,末尾必須以;;結束,執行時找到第一個匹配的分支並執行相應的命令,然后直
接跳到esac之后,不需要像C語言一樣用break跳出。

 

 

使用case語句的例子可以在系統服務的腳本目錄/etc/init.d中找到。

循環語句

4. for/do/done

 

 

 

   類C⽅方式  

 

5. while/do/done

 

 

Shell還有until循環,類似C語言的do...while循環。

6. Shell腳本的調試方法
Shell提供了一些用於調試腳本的選項,如下所示:
-n
讀一遍腳本中的命令但不執行,用於檢查腳本中的語法錯誤
-v
-x
提供跟蹤執行信息,將執行的每一條命令和結果依次打印出來
使用這些選項有三種方法,
一是在命令行提供參數
$ sh -x ./script.sh
⼆是在腳本開頭提供參數
#! /bin/sh -x

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM