循环

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次,已锁定"
相关推荐
龙哥说跨境几秒前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
懒大王就是我15 分钟前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
Elaine20239128 分钟前
06 网络编程基础
java·网络
pk_xz1234561 小时前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强2 小时前
Linux之sed命令详解
linux·运维·服务器
海绵波波1072 小时前
Webserver(4.3)TCP通信实现
服务器·网络·tcp/ip
九河云3 小时前
AWS账号注册费用详解:新用户是否需要付费?
服务器·云计算·aws
Lary_Rock4 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
幺零九零零4 小时前
【计算机网络】TCP协议面试常考(一)
服务器·tcp/ip·计算机网络
热爱跑步的恒川5 小时前
【论文复现】基于图卷积网络的轻量化推荐模型
网络·人工智能·开源·aigc·ai编程