腳本Demo:Github地址
1、條件測試:test [
命令test或[可以測試一個條件是否成立;一個指令的執行成功與否,可以使用$?變量來觀察;
例:
(1)命令test:Exit Status為0
? ~ var=2
? ~ test $var -gt 1
? ~ echo $?
0
(2)命令test:Exit Status為1
? ~ test $var -gt 3
? ~ echo $?
1
(3)[方式:語法格式錯誤(空格)
? ~ [$var -gt 3]
zsh: bad pattern: [2
(4)[方式:Exit Status為1
? ~ [ $var -gt 3 ]
? ~ echo $?
1
備注:由此可以看出左方括號[確實是一個命令的名字,傳給命令的各參數之間應該用空格隔開,比如,$VAR、-gt、3、]是[命令的四個參數,它們之間必須用空格隔開。命令test或[的參數形式是相同的,只不過test命令不需要]參數。
判斷語句 | 意義 |
---|---|
[ -d DIR ] | DIR是否存在并且是一個目錄 |
[ -e FILE ] | FILE是否存在 |
[ -f FILE ] | FILE是否存在并且是一個普通文檔 |
[ -r FILE ] | FILE是否具有可讀權限 |
[ -w FILE ] | FILE是否具有可寫權限 |
[ -s FILE ] | FILE是否存在并且為非空文檔 |
[ FILE1 -nt FILE2 ] | FILE1是否比FILE2新 |
[ FILE1 -ot FILE2 ] | FILE1是否比FILE2舊 |
[ -z STRING ] | STRING長度是否為0 |
[ -n STRING ] | STRING長度是否非0 |
[ STRING1 = STRING2 ] | 兩個字符串長度是否相等 |
[ STRING1 != STRING2 ] | 兩個字符串長度是否不相等 |
[ ARG1 OP ARG2 ] | ARG1和ARG2為整數或者取值為整數的變量;OP是-eq(相等),-ne(不相等),-lt(小于),-le(小于等于),-gt(大于),-ge(大于等于)中的一個 |
2、if/then/elif/else/fi
例1:
if [ -f /Users/charleswang/Programs/Fastfile ]; then
echo "ture"; fi
ture
其實是三條命令,
if [ -f /Users/charleswang/Programs/Fastfile ]```
是第一條,
```then
echo "ture"
是第二條,
fi
是第三條。
如果兩條命令寫在同一行則需要用;號隔開,一行只寫一條命令就不需要寫;號了,
另外,then后面有換行,但這條命令沒寫完,Shell會自動續行,把下一行接在then后面當作一條命令處理。
和[命令一樣,要注意命令和各參數之間必須用空格隔開。
if命令的參數組成一條子命令,如果該子命令的Exit Status為0(表示真),則執行then后面的子命令,如果Exit Status非0(表示假),則執行elif、else或者fi后面的子命令。if后面的子命令通常是測試命令,但也可以是其它命令。Shell腳本沒有{}括號,所以用fi表示if語句塊的結束。
例2:
if :; then echo "always ture"; fi
always ture
:是一個特殊的命令,稱為空命令,該命令不做任何事,但Exit Status總是真。
例3:根據輸入判讀,輸出判斷結果
#/bin/bash
echo "Is it morning? Please answer yes or no."
read YES_OR_NO
if [ "$YES_OR_NO" = "yes" ]; then
echo "Good morning!"
elif [ "$YES_OR_NO" = "no" ]; then
echo "Good afternoon!"
else
echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
exit 1
fi
exit 0
上例中的read命令的作用是等待用戶輸入一行字符串,將該字符串存到一個Shell變量YES_OR_NO中。這里我們同exit指令來讓程序中斷,并回傳數值給系統。
命令行執行:
? ~ sh /Users/charleswang/Programs/ShellTest.sh
Is it morning? Please answer yes or no.
yes
Good morning!
? ~
? ~
? ~
? ~ sh /Users/charleswang/Programs/ShellTest.sh
Is it morning? Please answer yes or no.
no
Good afternoon!
例4:多個輸入參數判斷,下例為輸入3個參數,首先判斷輸入參數個數是否小于2,如小于2個,則退出并輸出錯誤信息;若輸入大于2個參數,則分別賦值;并判斷第三個參數字符串長度是否為0,若長度為0,則默認賦值為'develop'
if [ "$#" -lt 2 ]; then
echo "wrong paramters count, exit"
exit
fi
git_branch=$1
build_type=$2
mail_group=$3
if [ -z $3 ]; then
mail_group='develop'
fi
echo "$# and $@ and ${1} and ${2} and $3"
備注:
參數 | 意義 |
---|---|
$# | 腳本中所有輸入的參數個數 |
$@ | 逐個顯示所有參數值 |
${1} | 獲取第一個參數 |
$3 | 獲取第三個參數 |
上例輸入輸出結果:
? ~ sh /Users/charleswang/Programs/ShellTest.sh 3.8.2 release develop
3 and 3.8.2 release develop and 3.8.2 and release and develop
例5:多重條件判斷式(在上面的代碼基礎上直接添加如下代碼)
if [ "$#" -lt 3 -a "$3" == "develop" ]; then
echo "參數總個數小于3 and 第三個參數值為develop"
elif [ "$#" -gt 2 -a "$3" == "develop" ]; then
echo "參數總個數大于2 and 第三個參數值為develop"
else
echo "false"
fi
備注:if判斷后必須添加;和then來處理。elif也是判斷式,因此出現elif后面也要接then來處理。但是else已經是最后的沒有成立的結果了,所以else后面不需要接then.
邏輯符號 | 代表 |
---|---|
-a | 與,AND |
-o | 或,OR |
例5:
s=0
i=0
while [ "$i" != "100" ]
do
i=$(($i+1))
s=$(($s+$i))
done
echo "result is => $s"
當[ "$i" != "100" ]條件成立時,就終止do執行的程序段,則否就執行。