if condition
then
statements
[elif condition
then statements. ..]
[else
statements ]
fi
#!/bin/bash
read -p "please input your name:" name ###read指令用于從控制台讀取輸入資料
printf '%s\n' $name
if [ $name = root ] ##注意if和後面的[]有間距
then
echo "hello ${name},welcome!"
elif [ $name = toto ]
else
echo "sb,get out here!"
腳本内容截圖:
1/ 條件判斷基本文法
[ condition ] (注意condition前後要有空格)
#非空傳回true,可使用$?驗證(0為true,>1為false)
[ itcast ]
#空傳回false
[ ]
注意[ ]内部的=周邊的空格,有差別:
[root@shizhan01 scripts]# if [ a = b ];then echo ok;else echo notok;fi
notok
[root@shizhan01 scripts]# if [ a=b ];then echo ok;else echo notok;fi
ok
短路(了解為三元運算符)
[ condition ] && echo ok || echonotok
條件滿足,執行&&後面的語句;條件不滿足,執行|| 後面的語句
2/ 條件判斷組合
注:[] 與[[ ]] 的差別:[[ ]] 中邏輯組合可以使用 && || 符号
而[] 裡面邏輯組合可以用 -a -o
[root@mini ~]# if [ a = b && b = c ]; then echo ok;else echo notok;fi
-bash: [: missing `]'
[root@mini ~]# if [ a = b -a b = b ]; then echo ok;else echo notok;fi
[root@mini ~]# if [ a = b -o b = b ]; then echo ok;else echo notok;fi
[root@mini ~]# if [[ a = b && b = b ]]; then echo ok;else echo notok;fi
[root@mini ~]# if [[ a = b || b = b ]]; then echo ok;else echo notok;fi
3/ 常用判斷運算符
字元串比較:= !=
-z 字元串長度是為0傳回true
-n 字元串長度是不為0傳回true
if [ 'aa' = 'bb' ]; then echo ok; else echonotok;fi
if [ -n "aa" ]; then echo ok;else echo notok;fi
if [ -z "" ]; then echo ok; elseecho notok;fi
整數比較:
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
檔案判斷:
-d 是否為目錄
if [ -d /bin ]; then echo ok; else echonotok;fi
-f 是否為檔案
if [ -f /bin/ls ]; then echo ok; elseecho notok;fi
-e 是否存在
if [ -e /bin/ls ]; then echo ok; elseecho notok;fi
while expression
do
command
…
done
i=1
while ((i<=3))
echo $i
leti++
while.sh腳本的内容如下:
while((i<=3))
echo $i
let i++
while2.sh的腳本内容如下:
echo '按下 <ctrl-d> 退出'
echo -n '輸入你最喜歡的電影名:'
while read film
echo "是的! $film 是一部好電影"
shell case語句為多選擇語句。可以用case語句比對一個值與一個模式,如果比對成功,執行相比對的指令。case語句格式如下:
case工作方式如上所示。取值後面必須為單詞in,每一模式必須以右括号結束。取值可以為變量或常量。比對發現取值符合某一模式後,其間所有指令開始執行直至;;。
取值将檢測比對的每一個模式。一旦模式比對,則執行完比對模式相應指令不再繼續其他模式。如果無一比對模式,使用星号*捕獲該值,再執行後面的指令。
下面的腳本提示輸入1到4,與每一種模式進行比對:
case.sh案例如下:
echo '輸入 1 到 4 之間的數字:'
echo '你輸入的數字為:'
read anum
case $anum in
1) echo '你選擇了 1 '
;;
2) echo '你選擇了 2'
3) echo '你選擇了 3'
4) echo '你選擇了 4'
*) echo '你沒有輸入 1 到 4之間的數字'
esac
運作結果:
[root@hadoop test]# sh case.sh
輸入 1 到 4 之間的數字:
你輸入的數字為:
4
你選擇了 4
3
你選擇了 3
再如例子case2.sh
case $1 in
start)
echo "starting"
stop)
echo "stoping"
*)
echo "usage:{start | stop}"
[root@hadoop test]# sh case2.sh start
starting
for n in 1 2 3
echo $n
[root@hadoop test]# sh for.sh
1
2
或
for n in {1..5}
5
再如如下例子:
[root@hadoop test]# ls
a.sh b.sh case.sh for.sh hello.sh login.log while2.sh
break.sh case2.sh continue.sh fortest.sh if.sh test.txt while.sh
[root@hadoop test]# cat fortest.sh
for shname in `ls *.sh`
name=`echo "$shname" | awk -f. '{print $1}'`
echo $name
[root@hadoop test]# sh fortest.sh
a
break
b
case2
case
continue
for
fortest
hello
if
while2
while
通過shell來統一放開端口
一簡單的字元串 枚舉周遊法,利用for in格式對字元串按空格切份的功能
services="80 22 25 110 8000 23 20 21 3306 "
for x in $services
do
iptables -a input -p tcp --dport $x -m state --state new -j accept
done
for ((i = 0; i <= 5; i++))
echo"welcome $i times"
for ((i = 0; i <= 5; i++)); do echo"welcome $i times"; done
定義for2.sh
for ((i=0;i<=5;i++))
echo "welcome $i times"
運作結果如下:
[root@hadoop test]# sh for2.sh
welcome 0 times
welcome 1 times
welcome 2 times
welcome 3 times
welcome 4 times
welcome 5 times
在循環過程中,有時候需要在未達到循環結束條件時跳出循環,shell使用兩個指令來實作該功能:break和continue。
break指令
break指令允許跳出所有循環(終止執行後面的所有循環)
下面的例子中,腳本進入死循環直到使用者輸入數字大于5。要跳出這個循環,傳回到shell提示符下,需要使用break名。
while :
echo -n "輸入 1 到 5 之間的數字:"
read anum
case $anum in
1|2|3|4|5) echo "你輸入的數字為 $anum!"
;;
*)
echo "你輸入的數字不是 1 到 5 之間的!遊戲結束"
break
esac
執行以上的代碼,輸入結果為:
[root@hadoop test]# sh break.sh
輸入 1 到 5 之間的數字:5
你輸入的數字為 5!
輸入 1 到 5 之間的數字:7
你輸入的數字不是 1 到 5 之間的!遊戲結束
continue指令與break指令類似,隻有一點差别,它不會跳出所有循環,僅僅跳出目前循環。對上面的例子進行修改:
echo -n "輸入 1 到 5 之間的數字:"
read anum
case $anum in
1|2|3|4|5) echo "你輸入的數字為$anum!"
;;
*) echo "你輸入的數字不是 1 到 5 之間的!"
continue
echo "遊戲結束"
esac
運作代碼,結果如下:
[root@hadoop test]# sh continue.sh
你輸入的數字不是 1 到 5 之間的!
輸入 1 到 5 之間的數字:2
你輸入的數字為2!
你輸入的數字為5!