1. 程式人生 > >shell程序設計-控制結構

shell程序設計-控制結構

rm命令 可執行 等於 取反 done class nts 設計 不同

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程序設計-控制結構