1、循环语句:
循环语句命令常用于重复执行一条命令或者一组命令,直到不结果不在满足循序条件时停止。
2、常见循环语句:
while、until、for以及select
3、while循环语句的语法
while <条件表达式>
do
命令
done
说明;while后面紧跟条件表达式,如果表达式满足,则执行do后面的命令,当执行到done时,会在重复判断条件表达式,是否满足,如果满足继续执行do后面的命令,直到不再满足条件表达式
3、until循环语句的语法
until <条件表达式>
do
命令
done
说明:until用法与while用法类似,唯一的区别是,until循环是在条件表达式不成立的时候,进入do循环,如果成立则终止循环。
4、while循环基本实例
1、每个2秒钟,输出一次系统负载情况
while true #true表示永远为真,在这里无论循环多少次,条件表达式一直成立
do
uptime #显示系统负载
sleep 2 #每2秒循序一次循环体
done
```
2、通过while循环输出987654321 #!/bin/bash a=9 while ((a>0)) do echo "$a" ((a--)) done 同样可以用until实现 #!/bin/bash a=9 until ((a<1)) do echo "$a" ((a--)) done 用until时,就是当变量a的值小于1成立时,终止循环
5、手机充值,每发送一条短信减掉1角5分钱,如果低于1角5分,提示余额不足,请充值
#!/bin/bash
sen_num=15 #定义余额变量,初始值15
fre_num=15 #定义每条短信使用金额为15
total=0 #定义发送次数变量,初始值为0次
. /etc/init.d/functions #调用系统函数库
function change () { #定菜单选择函数
echo '
===================================
1.充值
2.发送短信
3.查询余额
4.退出
===================================
'
}
function chong () { #定义充值函数
read -p "请输入充值金额:" pice #read读取用户输入的金额
expr $pice + 1 &>/dev/null #判断用户输入的金额是否为整数
if [ $? -ne 0 ] ;then
echo "请输入正确的数值!"
else
sen_num=$((sen_num+pice)) #余额增加
echo "当前可用余额:$sen_num"
fi
}
function jixu () { #定义询问用户是否继续发送短信函数
read -p "请问是否继续发送短信(yes|no):" A
case $A in
Y|yes)
send
;;
N|no)
main
;;
*)
echo "Input yes or no"
esac
}
function send () { #定义发送短信函数
if [ $sen_num -le $fre_num ] ; then #判断余额是否充足
printf "当前可用余额不足,请及时充值。\n"
else
while true
do
read -p "请输入短信内容:" content #read读取用户输入的短信内容
sen_num=$((sen_num-fre_num))
printf "SMS sent successfully!!!\n"
((total=total+1)) #每发送成功一次,发送次数加1
last=$((sennum/frenum)) #计算余额可发送多少条短信
printf "您已发送$total条短信!剩余$last!\n"
jixu #调用是否继续函数
if [ $sen_num -lt $fre_num ] ; then #判断可用余额情况
echo "余额不足,请充值!"
return 1
fi
done
fi
}
function main () { #定义主函数
while true
do
change #调用菜单函数
read -p "请选择你要操作的数字:" men #read读取用户选择的菜单数字
case $men in #判断数字,对应调用函数
1)
chong
;;
2)
send
jixu
;;
3)
printf "当前可用余额$sen_num"
;;
4)
exit 0
;;
*)
printf "输入错误,请输入{1|2|3|4}\n"
esac
done
}
main #调用主函数运行
### 6、while循环每个10秒确定网站是否正常
#!/bin/bash
. /etc/init.d/functions #调用系统函数库
total1=0 #定义次数变量
total () { #设置次数函数
((total1++))
if [ "$total1" -ge 2 ] ;then #判断执行次数是否大于等2次
exit 0
fi
}
if [ $# -ne 1 ];then #判断参数个数是否正确
printf "usage:$0 web_url \n"
exit 1
fi
while true
do
wget --spider --timeout 5 --tries=2 -qr $1 #通过wget命令判断网站
if [ $? -eq 0 ];then #返回状态值是否为0
action "$1 is ok" /bin/true #如果是,则表示网站正确
#exit 1
else
action "$1 is no" /bin/false #否则失败
fi
sleep 3 #每个3秒循环一次
total #调用次数函数,判断循环次数,如果超过2次,则退出脚本
done
### 7、while循环按行读取文件的方式:
1、通过exec读取
exec <file
while read line
do
命令
done
2、通过cat命令加管道读取文件
cat file|while read line ;do
命令
done
3、通过while结尾done输入重定向读取文件
while read line
do
命令
done <file
实例:读取Nginx或者Apache日志文件,每行的访问字节数对应的数字,并计算出总和
#!/bin/bash
sum=0 #定义字节数总和变量,初始值0
exec <$1 #通过exec命令读取文件
while read line;do #while循序读行
size=`echo $line|awk '{print $10}'` #通过awk命令截取访问字节数列
expr $size + 1 &>/dev/null #判断截取的是否为整数
if [ $? -ne 0 ];then #如果不为整数,continue命令则跳过非整数的部分,继续整数的加法计算
continue
fi
((sum=sum+$size))
done
echo "$sum"