shell程序設計-控制結構
1.shell 條件判斷
命令:test 或 [
使用“[”時,需使用“]”結尾,和判斷語句之間需要空格
如:判斷demo.c文件是否存在
if [ -f demo.c ]
then
…
fi
或
if test –f demo.c
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部分。
shell程序設計-控制結構