文章目錄
-
- 流程控制之while循環
-
-
- 二 、continue與break
-
- 三 、案例
-
- 案例1:監控web頁面狀态資訊, 失敗3次, 表示網站出現問題需要進行報警
- 案例2:猜數字
- 案例3:while循環
- 案例4:until
- 案例5:while循環
- 案例6:while循環
- 案例7:while和read實作逐行處理
- 案例8:用while循環+case來制作一個簡單的菜單功能
流程控制之while循環
1 、文法
# 一、while語句結構:條件為真時,執行循環體代碼
while 條件
do
循環體
done
# 二、until文法結構:條件為假時,一直執行循環體代碼,直到條件變為真
until 條件
do
循環體
done
2、簡單示例
[[email protected] day4]# cat count.sh
#! /bin/bash
count=0
while [ $count -lt 5 ];
do
echo $count
let count++
done
echo "================"
#! /bin/bash
count=0
until [ $count -gt 4 ];
do
echo $count
let count++
done
[[email protected]]# ./a.sh
0
1
2
3
4
================
0
1
2
3
4
# 99乘法表
[[email protected] ~]# cat 9.sh
for((i=1;i<=9;i++))
do
for((j=1;j<=i;j++))
do
let "s=i*j"
echo -ne "$i*$j=$s\t"
done
echo ""
done
echo "end" #取消換行符
#或者
for((i=1;i<=9;i++))
do
for((j=1;j<=i;j++))
do
let "((i*j))"
echo -ne "$i*$j=$((i*j))\t"
done
echo ""
done
[[email protected] ~]# ./9.sh
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
# 方式二
[[email protected] ~]# cat a.py
a = 1
while a < 10:
b = 1
while b <= a:
print("%s*%s=%s\t" % (a, b, a * b), end="") # end=""取消換行符,\t相當于tab鍵
b += 1
print("")
a += 1
print("")
[[email protected] ~]# yum -y install python3 #安裝python3
[[email protected] ~]# python3.6 a.py #python3.6運作a.py
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
# 方式三
[[email protected] ~]# cat 1.sh
a=1
while (( $a < 10 )); do
b=1
while (( $b <= $a )) ; do
echo -en "$b*$a=$(( $a*$b ))\t" # (echo -e \t)相當于tab鍵, (echo -n)取消換行符
let b++
done
let a++
echo ""
done
[[email protected] ~]# sh 1.sh
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
# 99乘法表加邊框
[[email protected] ~]# cat 91.sh
#!/bin/bash
x=1
STA1="---------"
STR2="|"
while (( x <= 9 ))
do
str=""
y=1
z=$x
while (( $z > 0 ))
do
echo -n $STA1
let z--
done
echo ""
while (( $y <= $x ))
do
str=$str"$STR2 $x*$y=$(echo $x*$y|bc) "
let y++
done
echo $str" "$STR2
let x++
done
while (( $x > 1 ))
do
echo -n $STA1
let x--
done
echo ""
---------
| 1*1=1 |
------------------
| 2*1=2 | 2*2=4 |
---------------------------
| 3*1=3 | 3*2=6 | 3*3=9 |
------------------------------------
| 4*1=4 | 4*2=8 | 4*3=12 | 4*4=16 |
---------------------------------------------
| 5*1=5 | 5*2=10 | 5*3=15 | 5*4=20 | 5*5=25 |
------------------------------------------------------
| 6*1=6 | 6*2=12 | 6*3=18 | 6*4=24 | 6*5=30 | 6*6=36 |
---------------------------------------------------------------
| 7*1=7 | 7*2=14 | 7*3=21 | 7*4=28 | 7*5=35 | 7*6=42 | 7*7=49 |
------------------------------------------------------------------------
| 8*1=8 | 8*2=16 | 8*3=24 | 8*4=32 | 8*5=40 | 8*6=48 | 8*7=56 | 8*8=64 |
---------------------------------------------------------------------------------
| 9*1=9 | 9*2=18 | 9*3=27 | 9*4=36 | 9*5=45 | 9*6=54 | 9*7=63 | 9*8=72 | 9*9=81 |
---------------------------------------------------------------------------------
[[email protected] day5]# cat 9.sh
#! /bin/bash
for i in {1..9}
do
for ((j=1;j<=i;j++))
do
let "(($i*$j))"
echo -ne "$i*$j=$(($i*$j))\t"
done
echo ""
done
二 、continue與break
1、差別
continue:預設退出本次循環
break:預設退出本層循環
2、示例
[[email protected]]# cat a.sh
#! /bin/bash
count=0
while [ $count -lt 5 ];
do
if [ $count -eq 4 ];then
break
fi
echo $count
let count++
done
echo "================"
#! /bin/bash
count=0
until [ $count -gt 4 ];
do
if [ $count -eq 4 ];then
let conunt++
continue
fi
echo $count
let count++
done
[[email protected]]# ./a.sh
0
1
3
================
0
1
3
三 、案例
# 奇數和偶數判斷
[[email protected] day1]# cat num3.sh
#! /bin/bash
num=100
while (( $num >= 0));
do
number=`echo "$num % 2" | bc`
if [ $number -eq 1 ];then
echo "$num是奇數"
fi
let num--
done
[[email protected] day1]# cat num4.sh
#! /bin/bash
num=100
while (( $num >= 0));
do
number2=`echo "$num % 2" | bc`
number3=`echo "$num % 3" | bc`
if [ $number2 -eq 0 ] && [ $number3 -eq 0 ];then
echo "$num是2和3公倍數"
fi
let num--
done
案例1:監控web頁面狀态資訊, 失敗3次, 表示網站出現問題需要進行報警
[[email protected] day4]# cat url.sh
#!/bin/bash
count=0
url=$1
while true
do
curl $1 &>/dev/null
if [ $? -eq 0 ];then
echo "$1 is ok"
break
else
let count++
fi
echo "false is ${count}"
if [ $count -eq 3 ];then
echo "$1 is down"
break
fi
done
[[email protected] day4]# ./url.sh http://www.jd.com
http://www.jd.com is ok
[[email protected] day4]# ./url.sh http://www.jd.col
false is 1
false is 2
false is 3
http://www.jd.col is down
false值等于3代表要進行第4次嘗試,證明頁面前通路3次均失敗
案例2:猜數字
# 補充知識
方法一: 通過random變量産生随機數 (0-32768)
echo $RANDOM
方法二: 通過openssl指令産生随機數
openssl rand -base64 10
方法三: 通過時間資訊擷取随機數
date +%S%N
方法四: 通過一個特殊裝置檔案生成随機數
head -c9 /dev/urandom|cksum
tr -dc 0-9 < /dev/urandom | head -c8
方法五: 利用UUID檔案生成随機數
cat /proc/sys/kernel/random/uuid
# 代碼實作
[[email protected] shell]# cat guess_age.sh
#!/bin/bash
num=`echo $((RANDOM%100+1))`
count=0
while :
do
[ $count -eq 3 ] && echo "猜的次數超過3次,退出" && exit
read -p "請輸入[1-100]之間的一個數字:" x
[[ ! $x =~ ^[0-9]+$ ]] && echo "必須輸入數字" && continue
if [ $x -gt $num ];then
echo "猜大了"
elif [ $x -lt $num ];then
echo "猜小了"
else
echo "猜對了"
break
fi
let count++
done
案例3:while循環
while : # 冒号代表永遠為真,無限循環
while true # 冒号代表永遠為真,無限循環
[[email protected] day4]# cat user.sh
#! /bin/bash
count=0
while true
do
read -p "請輸入正确的使用者名:" user
read -p "請輸入正确的密碼:" passwd
if [ $user = "mm" ] && [ $passwd = "123" ];then
echo "login successful"
while true
do
echo "0 退出"
echo "1 提款"
echo "2 轉賬"
echo "3 查詢餘額"
read -p "請輸出操作編号:" choice
case $choice in
"0")
#exit
break
;;
"1")
echo "正在提款"
;;
"2")
echo "正在轉賬"
;;
"3")
echo "正在查詢餘額"
;;
* )
echo "指令輸入錯誤,請重新輸入"
esac
done
break
else
echo "user error or passwd error"
let count++
fi
if [ $count -eq 3 ];then
echo "tries too many times"
break
fi
done
案例4:until
[[email protected] /]# cat 4.sh
#!/bin/bash
i=0
until [ $i -gt 4 ]
do
if [ $i == 2 -o $i == 3 ];then
let i++
continue
fi
echo $i
let i++
done
[[email protected] /]# . 4.sh
0
1
4
案例5:while循環
[[email protected] /]# cat 1.sh
#!/bin/bash
i=1
while ((i<10))
do
echo $i
((i++))
done
[[email protected] /]# . 1.sh
1
2
3
4
5
6
7
8
9
案例6:while循環
[[email protected] /]# cat 2.sh
#!/bin/bash
var1="AAA"
var2="BBB"
var3="CCC"
while :
do
clear
echo -e "1:${var1}\n2:${var2}\n3:${var3}"
temp=$var1
var1=$var2
var2=$var3
var3=$temp
sleep 1
done
案例7:while和read實作逐行處理
[[email protected] /]# cat 3.sh
#!/bin/bash
i=0
while read line
do
echo $i:$line
let i++
done</etc/passwd
案例8:用while循環+case來制作一個簡單的菜單功能
[[email protected] day4]# vim all.sh
#!/bin/bash
echo "script name: `basename $0`"
echo "version 1.0"
echo `date +%F_%H:%M:%S`
echo "Author: mm"
while read -p "(h for help): " var
do
case $var in
p|P|cpu|CPU)
echo -e "\n\n"
grep 'model name\|cpu MHz\|processor' /proc/cpuinfo |sort |uniq
echo -e "\n\n"
;;
m|m|mem|MEM)
echo -e "\n\n"
free
echo -e "\n\n"
;;
d|D|disk|DISK)
echo -e "\n\n"
df -Th
echo -e "\n\n"
;;
h|H|help|HELP)
echo -e "\n\tcommand\taction\n\n"
for i in cpu mem disk
do
echo -e "\t$i\t${i}_info"
done
echo -e "\thelp\tthis help page.."
echo -e "\tquit\texit !!.."
echo -e "\n\n"
;;
q|Q|quit|exit)
exit
;;
*)
echo -e "\n$var Enter Error...\n"
esac
done