天天看點

【轉載】shell中的條件判斷、參數以及變量替換

【test 指令】 

      test 指令是 shell 的内部指令,用于計算作為其參數的表達式是真還是假。 如果表達式為真,則 test 傳回0(注意與 c 語言 0 表示 false 不同),如果表達式為假,傳回非 0 。 

      shell 提供了另外一個調用 test 指令的方式,就是用方括号 [ ] 來代替單詞 test 。 

      調用 test 指令的格式為: 

<a href="http://my.oschina.net/moooofly/blog/170629#">?</a>

1

2

<code>test</code> <code>expr1 opr expr2 或是 [ expr1 opr expr2 ]</code>

<code>test</code> <code>opr expr1 或是 [ opr expr1 ]</code>

(注意方括号與表達式之間的空格必須存在) 

【邏輯運算符】 

      -a      expr1 -a expr2      邏輯與 

      -o      expr1 -o expr2      邏輯或 

        !      !expr1                    邏輯非 

【數值判斷】 

      -eq      if [ "$a" -eq "$b" ]      是否相等 

     -ne      if [ "$a" -ne "$b" ]      是否不相等 

      -gt       if [ "$a" -gt "$b" ]       是否大于 

      -ge      if [ "$a" -ge "$b" ]      是否大于等于 

      -lt        if [ "$a" -lt "$b" ]        是否小于 

      -le       if [ "$a" -le "$b" ]       是否小于等于

      &lt;         (("$a" &lt; "$b"))       小于(需要雙括号) 

      &lt;=      (("$a" &lt;= "$b"))     小于等于(需要雙括号) 

      &gt;        (("$a" &gt; "$b"))        大于(需要雙括号) 

      &gt;=      (("$a" &gt;= "$b"))     大于等于(需要雙括号) 

【字元串判斷】 

      =       if [ "$a" = "$b" ]        字元串是否相等 

      !=      if [ "$a" != "$b" ]       字元串是否不等 

      -n      if [ -n str1 ]                字元串長度是否不等于 0 

      -z      if [ -z str2 ]                 字元串長度是否等于 0 

      ==      if [ "$a" == "$b" ]     與 = 等價(但有例外)。 

【檔案判斷】 

      -b file      若檔案存在且是一個塊特殊檔案

      -c file      若檔案存在且是一個字元特殊檔案

      -d file      若檔案存在且是一個目錄

      -e file      若檔案存在

      -f file      若檔案存在且是一個規則檔案(普通檔案)

      -g file      若檔案存在且設定了sgid位的值

      -h file      若檔案存在且為一個符合連結

      -k file      若檔案存在且設定了”sticky”位的值

      -p file      若檔案存在且為一已命名管道

      -r file      若檔案存在且可讀

      -s file      若檔案存在且其大小大于零

      -u file      若檔案存在且設定了suid位

      -w file      若檔案存在且可寫

      -x file      若檔案存在且可執行

      -o file      若檔案存在且被有效使用者id所擁有

【指令行參數/位置變量】 

      $0      腳本的名字 

      $1, $2, ..., $9      腳本第 1 個到第 9 個指令行參數 

      $#      指令行參數的個數 

      $@ 或是 $*      所有指令行參數 

      $?      最後一條指令的退出狀态 

      $$      正在執行程序的 id(pid) 

給位置變量指派: 

3

4

<code>[root@betty ~]</code><code># set one two tree</code>

<code>[root@betty ~]</code><code># echo $1 $2 $3</code>

<code>one two tree</code>

<code>[root@betty ~]</code><code>#</code>

【shift 指令】 

      這條指令可以對位置參數進行移動,每次調用都會導緻:$1=$2、$2=$3、$3=$4.... 

      以下代碼可以列印出所有的參數 

5

<code>while</code> <code>[ -n</code><code>"$1"</code> <code>]</code>

<code>do</code>

<code>    </code><code>echo</code> <code>$1</code>

<code>    </code><code>shift</code>

<code>done</code>

【變量替換(指派)】 

      shell 提供了變量替換功能,使使用者能夠檢查變量的值,并根據選項改變它的值。 

      $variable      儲存在 variable 中的值 

      ${variable}      儲存在 variable 中的值 

      ${variable:-string}      如果 variable 的值非空,則值為 variable,否則值為 string 

      ${variable:+string}      如果 variable 的值非空,則值為 string,否則值為空 

      ${variable:=string}      如果 variable 的值非空,則值為 variable,否則值為 string 且 variable 的值設定為string 

      ${variable:?string}      如果 variable 的值非空,則值為 variable,否則顯示 string 并退出 

【正則表達中的特殊字元】 

行末:$       

行首:^ 

空格:\s 

行末空格:\s\+$ 

行首空格:^\+\s 

【注】 

      當在對變量進行判斷時最好将變量用雙引号括起來,這樣可以避免參數包含空格或是 tab 帶來的問題。如 " $home"、"$#" 等。 

      使用 [ expr ] 進行判定時,expr與 [ 及 ] 之間均必須有空格。 

       == 的功能在 [[ ]] 和 [] 中的行為是不同的 , 這個操作符将在 [[ ]] 結構中使用模式比對 。 如下: 

[[ $a == z* ]]        # 如果 $a 以 "z" 開頭(模式比對)那麼将為 true 

[[ $a == "z*" ]] # 如果 $a 等于 "z*" (字元比對),那麼結果為 true

[ $a == z* ]      # file globbing 和 word splitting 将會發生

[ "$a" == "z*" ] # 如果 $a 等于 z* (字元比對),那麼結果為 true

繼續閱讀