1. 程式人生 > >Shell語法—— while 條件語句

Shell語法—— while 條件語句

選擇 -s 返回 null big 規則 應用 使用場景 code

while 循環語句

while 循環語句語法格式為:

while < 條件表達式 >
do
        指令
done

有關腳本運行的相關用法

命令 說明
sh file.sh & 把 file.sh 腳本放到後臺運行(後臺運行腳本的常用方法)
ctl+c 停止執行當前腳本或任務
ctl+z 暫停執行當前腳本或任務
bg 把當前腳本或任務放到後臺執行
fg 把當前腳本或任務放到前臺執行。如果是多個腳本,需加編號,如: fg 2
jobs 查看當前執行的腳本或任務
kill 關閉執行的腳本任務

有關進程管理的 Linux 相關命令

命令 說明
kill、killall、pkill 殺掉進程
ps 查看進程
pstree 顯示進程狀態樹
top 顯示進程
renice 改變優先權
nohup 用戶退出系統之後繼續工作
pgrep 查找匹配條件的進程
strace 跟蹤一個進程的系統調用情況
ltrace 跟蹤進程調用庫函數的情況
小結

一. while 循環結構及相關語句綜合實踐

  1. while 循環的特長是執行守護進程,以及實現我們希望循環持續執行不退出的應用,適合用於頻率小於 1min 的循環處理其他的 while 循環幾乎都可以被 for 循環及定時任務 crontab 功能代替
  2. case 語句可以用 if 語句來替代,而在系統啟動腳本時傳入少量固定規則字符串的情況下,多用 case 語句,其他普通判斷多用 if 語句
  3. 一句換場景,if 語句、for 語句最常用,其次是 while(守護進程)、case(服務啟動腳本)

二. shell 腳本中各個語句的使用場景

  1. 條件表達式,用於簡短的條件判斷及輸出(文件是否存在,字符串是否為空等)
  2. if 取值判斷,多用於不同值數量較少的情況
  3. for 最常用於正常的循環處理中

案例一:
猜數字
隨機生成一個 100 以內的數字,讓用戶輸入數字來猜。遊戲規則:輸入的必須是數字,猜錯時出現大小提示,才對時給出所用次數

#!/bin/bash
total=0
RETVAL=0
key=$((RANDOM%100))
echo "Let‘s play the guessing game!"
echo "key:$key"
panduan(){
        read -p "input num: " num
        expr $num + 1 &>/dev/null
        RETVAL=$?
        if [ $RETVAL -ne 0 ];then
                echo "number number !!!"
                panduan
        fi
}

guess(){
        ((total++))
        if [ $num -lt $key ];then
                echo "It is too small"
                panduan
        elif [ $num -gt $key ];then
                echo "It is too big"
                panduan
        else
                echo "Guess right"
                echo "yi gong cai le $total ci"
                exit 0
        fi
}
main(){
        panduan
        while true
        do
          guess
        done
}
main $*

案例二:
手機充值並發送短信。這個案例並沒有實際用途,可以當做一個綜合練習玩玩的
以下功能:

  1. 充值,但重復充值金額不累計,充值後立即查詢余額無法正常使用
  2. 發送短信,輸入發送的條數和短信內容,當金額不足時,可以選擇(y:充值,n:修改發送條數,o:返回菜單)
  3. 查詢余額,只有當使用發送功能選擇(o:返回菜單)時,查詢才可以生常使用
  4. 退出,結束當前腳本
#!/bin/bash
RETVAL=0
balance=0
menu(){
cat << EOF
 1) Recharge
 2) Send information
 3) Query
 4) exit
EOF
read -p " please enter a number: " num
case $num in
        1)
          echo "Welcome to chongzhi !"
          recharge
          ;;
        2)
          echo "Welcome Check the balance !"
          send
          ;;
        3)
          echo "Welcome to the query interface !"
          selects
          ;;
        4)
          echo "Looking forward to your next arrival !"
          exit
          ;;
        *)
          echo "Tips:{1|2|3|4}"
          menu
esac
}

recharge(){
        read -p "please enter to RMB: " rmb
        expr $rmb + 1 &>/dev/null
        RETVAL=$?
        if [ $RETVAL -ne 0 ];then
                echo "please input num"
                recharge
        fi
        echo "$rmbs  Rechargs success"
        ((rmbs=$rmb + $balance))
        menu
}

send(){
        while true
        read -p "send several messages: " strips
        expr $strips + 1 &>/dev/null
        RETVAL=$?
        if [ $RETVAL -ne 0 ];then
                echo "please input num"
                send
        fi
        ((count=$strips * 15))
        do
          if [ $count -gt $rmbs ];then
                echo "Insufficient amount !!!"
                read -p "Recharge(y|n|o) ?" or
                if [ $or = y -o $or = Y ];then
                        recharge

                elif [ $or = n -o $or = N ];then
                        send
                else 
                        menu
                fi
          else 
                read -p "Please input information content: " input
                echo "sending:$input  send success"
                ((balance=$rmbs - $count))
                echo "Balance: $balance"
          fi
          ((rmbs=$rmbs - $count))
        done
}

selects(){
        echo "Query:$balance"
        menu
}

menu $*

案例三:
使用 while 守護進程的方式監控網站,每隔 10s 檢測一次網站是否正常

#!/bin/bash
. /etc/init.d/functions
count=0
url_list=(
www.baidu.com
blog.51cto.com
www.taobao.com
www.192.168.80.123.com
)

waits(){
        echo -n "3s run after"
        for((i=0;i<3;i++))
        do
                echo -n .
                sleep 1
        done
        echo 
}

url(){
        waits
        for((i=0; i<`echo ${#url_list[*]}`; i++))
        do
          wget -o /dev/null -T 3 --tries=1 --spider ${url_list[$i]}>/dev/null 2>&1
                if [ $? -eq 0 ];then
                        action "${url_list[$i]}" /bin/true
                else
                        action "${url_list[$i]}" /bin/false
                fi

        done
        ((count++))
}

main(){
        while true
        do
          url
          echo "------count:$count------"
          sleep 10
        done
}
main
while 循環按行讀文件

方法一:

cat 文件|while read line
do
  命令
done

方法二:

while read line
do
  命令
done<文件

案例一:
編寫一個 shell 腳本,實現 cat 命令的基本功能

#!/bin/bath
while read line
do
  echo $line
done</home/shell/fun.sh

案例二:
編寫 shell 腳本,根據短時間內的 PV 量封掉對應 ip,解決類 DoS 的功能

#!/bin/bash
count=0
while true
do
netstat -an|grep EST|awk -F ‘[ :]+‘ ‘{print $6}‘|sort|uniq -c>ip.log
exec<ip.log
while read line
do
        pv=`echo $line|awk ‘{print $1}‘`
        ip=`echo $line|awk ‘{print $2}‘`
        if [ $pv -gt 10 ]&&[ `iptables -nL|grep $ip|wc -l` -eq 0 ];then
                iptables -t filter -I INPUT -s $ip -j DROP
                echo "sun success"
        fi
done
        ((count++))
sleep 10
echo "---$count---"
done

Shell語法—— while 條件語句