1. 程式人生 > >條件語句詳解if,for,while,case,until,shift

條件語句詳解if,for,while,case,until,shift

if語句

單分支
if 判斷條件;then
條件為真的分支程式碼
fi
雙分支
if 判斷條件; then
條件為真的分支程式碼
else
條件為假的分支程式碼
fi
多分支
if 判斷條件1; then
條件1為真的分支程式碼
elif 判斷條件2; then
條件2為真的分支程式碼
elif 判斷條件3; then
條件3為真的分支程式碼
else
以上條件都為假的分支程式碼
fi

if示例

根據命令的退出狀態來執行命令

if ping -c1 -W2 station1 &> /dev/null; then
echo 'Station1 is UP'
elif grep "station1"
~/maintenance.txt &> /dev/null; then echo 'Station1 is undergoing maintenance‘ else echo 'Station1 is unexpectedly DOWN!' exit 1 fi

case語句

case 變數引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
預設分支
;;
esac
case支援glob風格的萬用字元:
*: 任意長度任意字元
?: 任意單個字元
[]:指定範圍內的任意單個字元
a|b: a或b

選菜選單

case $number in
1|2|3)
cmd1
;
; 4|5|6) cmd1 ;; ... *) cmd6 esac case指令碼 cat <<EOF 1:lamian 2:gaifan 3:jiaozi 4:baozi EOF
# 選菜選單  vim xuancai.sh
PS3="Please input a number:"
select MENU in lamian huimian gaifan jiaozi baozi quit;do
        case $REPLY in
        1|2)
                echo "The price is 15元"
                ;
; 3|5) echo "The price is 20元" ;; 4) echo "The price is 25元" ;; 6) echo "bye" break ;; *) echo "Input false" esac done
read -p "Please choose menu num: " menu
case $menu in
1|2)
    echo "lamian gaifan 15元 "
;;
3|4)
    echo "jiaozi baozi 10元"
;;
*)
echo "wrong"

例如:

read -p "Do you agree(yes or no)? " ans
ans= 'echo "$ans|tr 'a-z' 'A-Z'" '
case $ans in
y|yes)
echo yes
;;
n|no)
echo no
*)
echo wrong
;;
esac  

迴圈

for適用於有列表的迴圈
while適合沒有列表的迴圈,比較通用
until與while條件相反

for迴圈

for 變數名 in 列表;do
迴圈體
done
執行機制:
依次將列表中的元素賦值給“變數名”; 每次賦值後即執行一次迴圈體; 直
到列表中的元素耗盡,迴圈結束
for特殊格式
雙小括號方法,即((…))格式,也可以用於算術運算
雙小括號方法也可以使bash Shell實現C語言風格的變數操作
I=10
((I++))
for迴圈的特殊格式:
for ((控制變數初始化;條件判斷表示式;控制變數的修正表示式))
do
迴圈體
done
控制變數初始化:僅在執行到迴圈程式碼段時執行一次
控制變數的修正表示式:每輪迴圈結束會先進行控制變數修正運算,而後再做
條件判斷

for     ;do
      for    ;do
         if        ;then
             continue,break(預設1,2為退出,執行外層迴圈)
         fi
      done
done
lastb  查詢其他人登陸失敗的資訊
&> /dev/null  #將輸出結果扔到垃圾箱,不在螢幕顯示
防止dos攻擊,將攻擊的ip地址放到/data/cracker_ip.log中
netstat -nat|sed -nr '/^tcp /s/.*  ([1-9].*):.*/\1/p'|sort  |uniq -c |while read iplist ;do
        linknum=`echo $iplist|cut -d" " -f1`
        ip=`echo $iplist|cut -d" " -f2`
        if [ $linknum -ge 2 ];then
                echo $ip >> /data/cracker_ip.log
        fi
done
#!/bin/bash
# 象棋方塊
for i in {1..8};do
        temp1=$[ $i % 2 ]

        for j in {1..8};do
        temp2=$[ $j % 2 ]

        if [ $temp1 -eq  $temp2  ];then
                echo -e -n "\033[47m  \033[0m"
        else
                echo -e -n "\033[41m  \033[0m"
        fi

        done

        echo 
done

實驗:輸入一個行號,列印一個等腰三角形

如圖:
在這裡插入圖片描述

#!/bin/bash
#********************************************************************
read -p "Please input line: " line
for i in `seq $line`;do
        let star=$i*2-1
        let space=$line-$i
        for j in `seq $space`;do
                echo -n " "
        done
        for k in `seq $star`;do
                echo -n "*"
        done
        echo
done

批量ping一個網路ID中的254個IP地址,並把能夠Ping通的地址放到:/tmp/iplist.log

例如ping百度的IP:123.125.115.110
bash scanip00.sh 輸入正確格式的IP地址
ping
cat /tmp/iplist.log
結果
能夠Ping通的IP
程式碼

#********************************************************************
#scanip00.sh    # 指令碼名
> /tmp/iplist.log   #每次執行前清空該檔案內容
read -p "Please input a netid:(eg:192.168.34.0) " netid  #輸入IP
netid=`echo $netid | sed -nr 's#(.*)\..*#\1#p'`
echo netid=$netid
for id in {1..254};do
        {
        if ping -c1 -w1  $netid.$id &>/dev/null ;then
                echo "$netid.$id" >> /tmp/iplist.log  #ping通的放入檔案
                echo $netid.$id is up
        else 
                echo $netid.$id is down
        fi
        }&                  #並行執行
done
wait

計算從1加到100
echo {1…100}|tr ’ ’ +|bc 管道計算得出5050
或者寫一個指令碼
sum.sh
sum=0
for i in {1…100};do
let sum=sum+i
done
echo sum=$sum
bash sum.sh 得出5050

while迴圈

while CONDITION; do
迴圈體
done
CONDITION:迴圈控制條件;進入迴圈之前,先做一次判斷;每一次迴圈之後
會再次做判斷;條件為“true”,則執行一次迴圈;直到條件測試狀態為“false”
終止迴圈
因此:CONDTION一般應該有迴圈控制變數;而此變數的值會在迴圈體不斷地被
修正
進入條件:CONDITION為true
退出條件:CONDITION為false

until迴圈

until CONDITION; do
迴圈體
done
進入條件: CONDITION 為false
退出條件: CONDITION 為true
迴圈控制語句continue
用於迴圈體中
continue [N]:提前結束第N層的本輪迴圈,而直接進入下一輪判斷;最內層為第1層
while CONDTIITON1; do
CMD1

if CONDITION2; then
continue
fi
CMDn

done

迴圈控制語句break

用於迴圈體中
break [N]:提前結束第N層迴圈,最內層為第1層
while CONDTIITON1; do
CMD1

if CONDITION2; then
break
fi
CMDn

done

迴圈控制shift命令

shift [n]
用於將參量列表 list 左移指定次數,預設為左移一次。
參量列表 list 一旦被移動,最左端的那個引數就從列表中刪除。while 迴圈遍歷位置參量列表時,常用到 shift
./doit.sh a b c d e f g h
./shfit.sh a b c d e f g h

#!/bin/bash
#Name: doit.sh
#Purpose: shift through command line arguments
#Usage: doit.sh [args]
while [ $# -gt 0 ] # or (( $# > 0 ))
do
echo $*
shift
done

在這裡插入圖片描述

#!/bin/bash
#step through all the positional parameters
until [ -z “$1” ]
do
echo “$1”
shift
done
echo
在這裡插入圖片描述

建立無限迴圈

while true; do
迴圈體
done
until false; do
迴圈體
Done

select迴圈與選單

select variable in list
do
迴圈體命令
done
select 迴圈主要用於建立選單,按數字順序排列的選單項將顯示在標準錯誤上,並顯示 PS3 提示符,等待使用者輸入
使用者輸入選單列表中的某個數字,執行相應的命令
使用者輸入被儲存在內建變數 REPLY 中
select 是個無限迴圈,因此要記住用 break 命令退出迴圈,或用 exit 命令終止指令碼。也可以按 ctrl+c 退出迴圈
select 經常和 case 聯合使用
與 for 迴圈類似,可以省略 in list,此時使用位置參量