條件語句詳解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地址
cat /tmp/iplist.log
結果
程式碼
#********************************************************************
#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,此時使用位置參量