1、概念
是一种重复执行一段代码的结构。只要满足循环的条件会一直执行这个代码
2、组成
循环条件:在一定范围之内,按照指定的次数来执行循环
循环体:在指定的次数内执行的命令序列。只要条件满足,循环体会被一直执行
3、循环和遍历
遍历:对数据结构中每个元素进行一次访问的过程,通常和循环一起使用。
访问的目的就是为了执行特定的操作
循环是操作,遍历是输出
4、循环的作用
(1)重复执行代码,尤其是统一的、相同的、批量的操作
(2)提高代码的重复利用率
(3)提高人工的效率,减少人工的干预
(4)简化程序的逻辑,降低代码出错的可能性
5、循环的语法
5.1for循环
使用场景:用于已知循环次数的场景
5.1.1格式1
for 变量名称(前面没有$)in 范围{}
do
命令序列
done
例1:创建一个文件passwd.txt,在这个文件中创建三行xy101,xy102,xy103,使用循环创建这三个用户,统一设定密码为123456
vim passwd.txt
xy101
xy102
xy103
wq!
for user in $(cat /opt/passwd.txt)
do
useradd $user
echo 123456 | passwd --stdin $user
done
累计求和
例:1-100一直相加,求最后的结果
sum=0
for i in {1..100}
do
sum=$(($sum+$i))
done
echo $sum
分别求出奇数以及偶数和?
sum1=0
sum2=0
for i in {1..100}
do
if [[ $i%2 -eq 0 ]]
then
sum1=$(($sum1+$i))
else
sum2=$(($sum2+$i))
fi
done
echo $sum1
echo $sum2
5.1.2格式2:类c语言格式
for ((表达式1;表达式2;表达式3))
do
命令序列
done
如:for ((i=0;i<=5;i++))
表达式1:定义变量并且赋予初始值
表达式2:循环的范围
表达式3:循环的方式,变量每一次自增1
例:自定义输入一个数(不超过100),求从1到该数字的累加和?
sum=0
read -p "输入一个随机数:" num
for ((i=1;i<=$num;i++))
do
sum=$(($sum+$i))
done
echo $sum
5.1.3格式3:死循环
for ((;;))
do
命令序列
done
随机数$RANDOM
循环控制语句 continue break
break:在循环内部,执行到break命令时,会立即跳出当前循环,并终止。
continue:执行到continue时,跳出当前循环,但是如果循环条件依然满足,会执行后续的循环条件
exit:满足条件立刻退出,不论有几层
例:猜数字,输入一个0-100的随机数,这个随机数由系统生成。死循环,直到用户猜中为止,猜中了循环才会终止。猜大了,提示用户猜大了,猜小了,提示用户猜小了,猜对了,终止循环,并提示用户你猜对了,并且显示猜了几次猜对了。
time=0
num=$((RANDOM%100+1))
for ((;;))
do
read -p "请输入一个数字:" user
let time++
if [ $num -eq $user ]
then
echo "你猜对了,一共猜了$time次"
break
elif [ $user -gt $num ]
then
echo "猜大了"
elif [ $user -lt $num ]
then
echo "猜小了"
fi
done
5.2while循环
和for循环可以通用,常用于死循环
while:满足条件就执行循环,不满足条件才会退出
死循环,不知道循环多少次,需要主动结束循环或者达到条件才结束循环
while[ 判断条件 ]
do
命令序列
done
死循环:
while true: 永远为真为死循环
while [ 1 -eq 1]
5.3until循环
条件不满足才执行循环,一旦条件成立循环终止
until [ 条件测试 ]
do
命令序列
done
6、双层循环和循环控制语句的使用
echo:打印
-n:表示不换行输出
-e:输出转义字符
\b:相当于退格键(backspace)
\n:相当于换行(回车)
\f:换行,换行后的新行的开头连着上一行的行尾
\t:相当于tab键,横向制表符
echo -ne 既不换行输出,又可以输出转义字符
循环控制,continue和break的默认数值是1
break:一旦break,后续的条件不再执行
continue:跳出当次,后续的条件成立,继续执行
exit:满足条件立刻退出,不论有几层
7.练习
练习1:打印出/opt目录下所有的文件(包括目录)
for file in /opt/*
do
echo $file
done
练习2:利用for循环,将/opt目录下,所有以.txt结尾的文件合并成一个文件,合并到xy102.txt
for file in /opt/*.txt
do
cat $file >> /opt/xy102.txt
done
练习3:测试一个网段,C类的私有地址32位的网段,测试可以ping通的保留到/opt/hosts.txt,ping不通的,提示不通即可。
read -p "请输入一个网段的开头(192.168.230.):" ip
for i in {1..254}
do
{
ping -c 2 $ip$i &> /dev/null
if [ $? -eq 0 ]
then
echo "$ip$i is online"
echo $ip$i >> /opt/hosts.txt
else
echo "$ip$i is offline"
fi
}&
done
wait
练习4:计算器,实现整数的+-*/以及%
read -p "请输入一个数:" num1
read -p "请输入运算符号(+,-,*,/,%):" fh
read -p "请再输入一个数:" num2
if [ "$fh" == "+" ]
then
echo "结果为:$(($num1+$num2))"
elif [ "$fh" == "-" ]
then
echo "结果为:$(($num1-$num2))"
elif [ "$fh" == "*" ]
then
echo "结果为:$(($num1*$num2))"
elif [ "$fh" == "/" ]
then
if [ $num2 -eq 0 ]
then
echo "除数不能为0"
else
echo "结果为:$(($num1/$num2))"
fi
fi
练习5:计算器,实现整数的+-*/以及%
while true
do
read -p "请输入一个数:" num1
read -p "请输入运算符号(+,-,*,/,%):" fh
read -p "请再输入一个数:" num2
if [ "$fh" == "+" ]
then
echo "结果为:$(($num1+$num2))"
elif [ "$fh" == "-" ]
then
echo "结果为:$(($num1-$num2))"
elif [ "$fh" == "*" ]
then
echo "结果为:$(($num1*$num2))"
elif [ "$fh" == "/" ]
then
if [ $num2 -eq 0 ]
then
echo "除数不能为0"
else
echo "结果为:$(($num1/$num2))"
fi
fi
练习4:计算器,实现整数的+-*/以及%
read -p "请输入一个数:" num1
read -p "请输入运算符号(+,-,*,/,%):" fh
read -p "请再输入一个数:" num2
if [ "$fh" == "+" ]
then
echo "结果为:$(($num1+$num2))"
elif [ "$fh" == "-" ]
then
echo "结果为:$(($num1-$num2))"
elif [ "$fh" == "*" ]
then
echo "结果为:$(($num1*$num2))"
elif [ "$fh" == "/" ]
then
if [ $num2 -eq 0 ]
then
echo "除数不能为0"
else
echo "结果为:$(($num1/$num2))"
fi
fi
练习5:定义了一个密码,脚本判断密码输入是否正确,正确的密码为123456,输入正确提示正确,输入3次,提示3次错误,密码已锁定
i=1
psd="123456"
while [ $i -le 3 ]
do
read -p "请输入验证码: " key
if [ "$key" == "$psd" ]
then
echo "验证码正确"
exit
else
echo "输入错误"
let i++
fi
done
echo "密码输入超过3次,已锁定"