目录
前言
实际工作环境中,当面对各种列表重复负责任务时,使用简单得if语句难以满足要求,而顺序
编写全部代码,显得繁琐,那么循环语句就可以很好得解决类似得问题
一、使用for循环语句
1、for循环基本概念
使用for循环语句时,需要指定一个变量可能的取值列表(for语句执行条件),针对每一个不
同 的取值重复执行相同的命令序列,直到变量值用完退出循环。
in关键字为变量i预先设置了一个取值列表,多个取值之间以空格进行分隔。do……done之间
的为命令序列,称为“循环体”。取值列表为for语句的执行条件,其中包括多个属性相同的对象,需
要预先指定(如通讯录、IP、黑名单、邮件地址列表等等)。
2、典型for应用
①、for循环简单应用
[root@kang mytext]# vim forxx.sh
#!/bin/bash
#可以输出1-10的数
a=10
for i in `seq $a`
do
echo $i
done
[root@kang mytext]# bash forxx.sh
1
2
3
4
5
6
7
8
9
10
[root@kang mytext]# vim forxx.sh
#!/bin/bash
#输出0~50中间的偶数,“命令含义,0~50每隔两位输出”。{1..50..2}可以输出奇数
for i in {0..50..2}
do
echo $i
done
[root@kang mytext]# bash forxx.sh
0
2
4
6
8
10
12
……
②、使用双重for循环创建九九乘法表
[root@kang mytext]# vim forxx.sh
#!/bin/bash
#九九乘法表,方法一
#双重for循环
#for ((i=1;i<=9;i=i+1))
#do
# for ((j=1;j<=i;j++))
# do
# echo -n " $i x $j=$(expr $i \* $j) " #-n是不换行
# if [ $j -eq $i ];then
# echo " " # 或者echo -e "\n" #换行,
# fi
# done
#done
[root@kang mytext]# bash forxx.sh
1 x 1=1
2 x 1=2 2 x 2=4
3 x 1=3 3 x 2=6 3 x 3=9
4 x 1=4 4 x 2=8 4 x 3=12 4 x 4=16
5 x 1=5 5 x 2=10 5 x 3=15 5 x 4=20 5 x 5=25
6 x 1=6 6 x 2=12 6 x 3=18 6 x 4=24 6 x 5=30 6 x 6=36
7 x 1=7 7 x 2=14 7 x 3=21 7 x 4=28 7 x 5=35 7 x 6=42 7 x 7=49
8 x 1=8 8 x 2=16 8 x 3=24 8 x 4=32 8 x 5=40 8 x 6=48 8 x 7=56 8 x 8=64
9 x 1=9 9 x 2=18 9 x 3=27 9 x 4=36 9 x 5=45 9 x 6=54 9 x 7=63 9 x 8=72 9 x 9=81
[root@kang mytext]# vim forxx.sh
#!/bin/bash
#九九乘法表,其他的应用
#for ((i=10;i<=19;i=i+1))
#do
# for ((j=10;j<=i;j++))
# do
# if [ $j -le $i ];then
# echo -n "${i}x${j}=$((i*j)) "
# fi
# if [ $j -eq $i ];then
# echo -e "\n"
# echo " "
# fi
# done
#done
③、求和
[root@kang mytext]# vim forxx.sh
#!/bin/bash
sum=0
for i in {1..100}
do
if [ $((i%2)) -eq 0 ];then
let sum=$i+$sum #1-100偶数求和
fi
done
echo $sum
[root@kang mytext]# bash forxx.sh
2550
④、批量创建用户
[root@kang mytext]# vim forxx.sh
#!/bin/bash
for userna in $(cat /mytext/user.txt) # user.txt文件内容为用户名
do
id $userna &> /dev/null
if [ $? -eq 0 ];then
echo "$userna 该用户已存在"
else
useradd $userna #调用用户名列表来创建用户
echo "123456" | passwd --stdin $userna &>/dev/null
echo "已创建用户$userna,并设置密码 "
fi
done
[root@kang mytext]# bash forxx.sh
wangwu 该用户已存在
zhangsan 该用户已存在
正在创建信箱文件: 文件已存在
已创建用户lisi,并设置密码
########.............或者可以批量创建简单用户名的用户
#for i in {1..5}
#do
# useradd kgc$1
# echo "123456" |passwd --stdin kgc$1
#done
⑤、或者可以判断输入密码是否正确
[root@kang mytext]# vim forxx.sh
#!/bin/bash
init=123456
for i in {1..3}
do
read -p "请输入密码" pass
if [ $pass == $init ];then
echo "密码正确"
exit
fi
done
echo "密码错误"
for语句非常适合用于列表对象无规律,且列表来源已固定(如某个列表文件)的场合。但是
对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使
用另外的一种循环while语句
二、使用while循环语句
1、while语句简介
使用 while循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时
为止。在脚本应用中,应该避免出现死循环的情况,否则后边的命令操作将无法执行。因此,循环
体内的命令序列中应包括修改测试条件的语句,以便在适当的时候使测试条件不再成立,从而结束
循环。
while循环语句的语法结构如下所示:
注意:使用 while循环语句时,有两个特殊的条件测试操作,即true(真)和 false(假)·使
用true作为条件时,表示条件永远成立,循环体内的命令序列将无限执行下去,除非强制终止脚本
(或通过exit语句退出脚本);反之,若使用 false作为条件,则循环体将不会被执行。这两个特殊
条件也可以用在if语句的条件测试中。
2、实际应用
①、简单while循环
[root@kang mytext]# vim whilexx.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo $i
let i++ #无此条件将死循环
done
echo "最后的i,值为:$i"
[root@kang mytext]# bash whilexx.sh
1
2
3
4
5
最后的i,值为:6
[root@kang mytext]#
②、输出1~100不能被3整除的数
[root@kang mytext]# vim whilexx.sh
#!/bin/bash
i=1
while [ $i -le 100 ]
do
if [[ $i%3 -ne 0 ]] # %属于数字运算,一个中括号不能运行
then
echo "$i"
fi
let i++
done
[root@kang mytext]# bash whilexx.sh
1
2
4
5
7
……
③、猜商品价格游戏
[root@kang mytext]# vim whilexx.sh
#!/bin/bash
PRICE=`expr $RANDOM % 1000` #使用系统随机数$RANDOM
a=0
echo "商品实际价格范围0-999,猜猜看是多少?"
while true
do
read -p "请输入你猜测的价格数目:" n
let a++
if [ $n -eq $PRICE ];then
echo "恭喜你回答正确,实际价格是$PRICE"
echo "你总共猜测了$a次"
break
elif [ $n -gt $PRICE ];then
echo "猜错。提示:高"
elif [ $n -lt $PRICE ];then
echo "猜错。提示:低"
# elif [ $n -gt 1000 ];then
else
echo "傻了吗"
fi
done
[root@kang mytext]# bash whilexx.sh
……
请输入你猜测的价格数目:919
恭喜你回答正确,实际价格是919
你总共猜测了9次
[root@kang mytext]#
④、服务监控
[root@kang mytext]# vim whilexx.sh
#!/bin/bash
while ps aux | grep httpd | grep -v grep &>/dev/null
do
echo "httpd open"
sleep 60
done
DATE=`%y/%m/%d`
echo "$DATE httpd服务器未启动,请尽快处理故障!" > /mytext/httpd.txt
[root@kang mytext]# bash whilexx.sh
[root@kang mytext]# vim httpd.txt
21-09-14-13:03:11 httpd服务器未启动,请尽快处理故障!
……
三、使用until循环语句
重复测试某个条件,只要条件不成立则反复执行。它与while测试刚好相反。
[root@kang mytext]# vim untilxx.sh
#!/bin/bash
#1-50赋值相加总和
i=1
until [ $i -eq 51 ] #条件为假则继续运行以下;真则退出循环。
do
sum=$[$i+$sum]
let i++
done
echo "$sum"
[root@kang mytext]# bash untilxx.sh
1275
四、循环控制语句
循环一般会搭配条件判断语句和流程控制语句一起执行,那么就会出现需要跳过循环和中止循
环的情况,控制循环的命令有以下3个
1、continue
继续,但不会执行循环体内下面的代码了,开始重新开始下一次循环。即continue是跳过当次
子循环中剩下的语句,执行下一次循环。
[root@kang mytext]# vim untilxx.sh
#!/bin/bash
for ((i=1;i<=5;i++))
do
if [ $i -eq 3 ];then
continue #结果是1245,3不输出,跳出后面的echo语句执行下一次循环
else
echo $i
fi
done
[root@kang mytext]# bash untilxx.sh
1
2
4
5
2、break
打断,马上停止本次循环,执行循环体外的代码。
[root@kang mytext]# vim untilxx.sh
#!/bin/bash
for ((i=1;i<=5;i++))
do
if [ $i -eq 3 ];then
break #结果是12,3以后都不输出,终止本次循环
else
echo $i
fi
done
[root@kang mytext]# bash untilxx.sh
1
2
3、exit
直接跳出程序,后面可跟状态返回码如exit 1等等。
[root@kang mytext]# vim untilxx.sh
#!/bin/bash
for ((i=1;i<=5;i++))
do
if [ $i -eq 3 ];then
exit 122 #结果是12,exit直接跳出程序,并返回返回码
else
echo $i
fi
done
[root@kang mytext]# echo $?
0
[root@kang mytext]# bash untilxx.sh
1
2
[root@kang mytext]# echo $?
122
总结
for:读取不同变量值,用来执行同一组命令
while:重复测试某个条件,只要条件成立则反复执行
until:重复测试某个条件,只要条件不成立则反复执行
循环控制语句:continue、break、exit