天天看點

shell程式設計--流程控制for,do-while,if-then,break,continue,case等

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!