Shell語法—— while 條件語句
阿新 • • 發佈:2018-10-10
選擇 -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 循環結構及相關語句綜合實踐
- while 循環的特長是執行守護進程,以及實現我們希望循環持續執行不退出的應用,適合用於頻率小於 1min 的循環處理其他的 while 循環幾乎都可以被 for 循環及定時任務 crontab 功能代替
- case 語句可以用 if 語句來替代,而在系統啟動腳本時傳入少量固定規則字符串的情況下,多用 case 語句,其他普通判斷多用 if 語句
- 一句換場景,if 語句、for 語句最常用,其次是 while(守護進程)、case(服務啟動腳本)
二. shell 腳本中各個語句的使用場景
- 條件表達式,用於簡短的條件判斷及輸出(文件是否存在,字符串是否為空等)
- if 取值判斷,多用於不同值數量較少的情況
- 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 $*
案例二:
手機充值並發送短信。這個案例並沒有實際用途,可以當做一個綜合練習玩玩的
以下功能:
- 充值,但重復充值金額不累計,充值後立即查詢余額無法正常使用
- 發送短信,輸入發送的條數和短信內容,當金額不足時,可以選擇(y:充值,n:修改發送條數,o:返回菜單)
- 查詢余額,只有當使用發送功能選擇(o:返回菜單)時,查詢才可以生常使用
- 退出,結束當前腳本
#!/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 條件語句