shell程序設計-控制結構

1.shell 條件判斷shell

命令:test 或 [測試

使用「[」時,需使用「]」結尾,和判斷語句之間須要空格spa

如:判斷demo.c文件是否存在code

if [ -f demo.c ]blog

then字符串

string

fiit

io

if test –f demo.cclass

then

fi

 

1.1字符串比較

string1 = string2                相同爲真

string1 != string2               不一樣爲真

-n string                                字符串不爲空爲真

-z string                                       爲null爲真

 

1.2    算術比較

exp1 –eq exp2            相等爲真

exp1 –ne exp2            不等爲真

exp1 –gt exp2           exp1大於exp2爲真

exp1 –ge exp2            exp1大於等於exp2爲真

exp1 –lt exp2              exp1小於exp2爲真

exp1 –le exp2            exp1小於等於exp2爲真

!exp                           取反,exp結果爲假結果爲真

1.3    文件條件測試

-d file                           若是文件是一個目錄則結果爲真

-e file                           若是文件存在則結果爲真,歷史上-e選項不可移植,一般用-f替代

-f file                            若是文件是普通文件則結果爲真

-g file                            若是文件的set-group-id位被設置則結果爲真

-r file                            若是文件可讀則結果爲真

-s file                             若是文件的大小不爲0則結果爲真

-u file                           若是文件的set-user-id位被設置則結果爲真

-w file                           若是文件可寫則結果爲真

-x file                             若是未經可執行則結果爲真

2 控制結構

2.1 if語句

if condition1 then statements1 elif condition2 then statements2 else statements3 fi

 

2.2 for

for var in values do statements done

 

默認狀況下,全部shell變量值均被認爲是字符串,for特別適用於對一系列字符串進行循環處理。

2.3 while

適用於不知道循環次數

while condition do statements done

 

2.4 until

 和while相似

until condition do statement done 

2.7 case

case var in pattern [ | pattern ] …) statements;; pattern [ | pattern ] …) statements;; … esac

例1

#!/bin/sh echo "Is it morning? Enter yes or no" read timeofday case "$timeofday" in yes) echo "morning" ;; no) echo "afternoon" ;; y) echo "morning" ;; n) echo "afternoon";; *) echo "default ,no pattern" esac exit 0



例2
#!/bin/sh

echo "Is it morning? Enter yes or no" read timeofday case "$timeofday" in yes | y | Yes | YES ) echo "Morning";; n* | N* ) echo "Afternoon";; * ) echo "not recognizied";; esac exit 0
 
  

每一個case條目語句須要使用「;;」做爲結束符,但不是必須的,最後一個case條目可省略「;;」,case執行它找到的第一個匹配而不是最佳匹配,因此通常把最佳匹配放在最開始。




2.8 AND列表

Statement1 && statement2 && statement3 && …

執行邏輯爲,只有在前面全部的命令都執行成功的狀況下才執行後一條命令,從左開始順序執行每條命令,若是一個命令返回的是true,右邊的statement纔可以執行,直到一條命令返回false,或者列表的全部命令都執行完畢。

#!/bin/sh

touch file_one

rm  -f file_two

if [ -f file_one ] && echo "hello" && [ -f file_two ] && echo "there" then  echo "in if " else  echo "in else" fi

exit 0

 輸出:

hello
in else
解析:touch和rm命令確保當前目錄中的有關文件處於已知狀態,而後&&列表執行[ -f file_one ]語句,返回true,繼續執行echo 「hello」,echo命令老是返回true,繼續執行第三個測試[ -f file_two],測試失敗,執行結束,AND列表返回false,if語句執行它的else部分

2.9 OR列表

 Statement1 || statement2 || statement3 || …

從左開始順序執行每條命令,若是一條命令返回的是false,右邊的命令才能被執行,直到一條命令返回true,或全部命令都執行完畢。

#!/bin/sh

rm -f file_one

 

if [ -f file_one ] || echo "hello"  || echo "there" then  echo "in if " else  echo "in else" fi

exit 0

 

輸出:

hello
in if

解析:

[ -f file_one]執行失敗,繼續執行echo語句,返回true,後面的命令無需執行,OR列表返回true,if語句執行then部分。

相關文章
相關標籤/搜索