循环

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次,已锁定"
相关推荐
tedcloud1231 小时前
God‘s Eye View 怎么搭建?在云服务器上部署一个实时 3D 地球可视化平台
linux·服务器·开发语言·后端·rust
初願致夕霞1 小时前
Linux 进程间通信(IPC)机制详解:管道、FIFO 与 System V 共享内存
linux·服务器·c++
傲世仙尊2 小时前
从磁盘硬件到Ext文件系统-Linux磁盘级文件系统学习笔记
linux·运维·服务器·开发语言·c++
曦夜日长2 小时前
Linux系统篇,进程概念(三):进程状态详解、僵尸进程与孤儿进程的深度解析、Slab机制的了解
linux·运维·服务器
liulilittle2 小时前
为什么采用全局管理缓存及状态:麻将客户端状态管理
服务器·网络·游戏·客户端·异步·mahjong·麻将
酣大智2 小时前
OSPF引入的直连路由在 ospf 路由表中看不到
网络·ospf
2601_966377132 小时前
等保2.0最新标准新增安全数据处理要求后怎么办?等保一体机数据安全模块来助力
运维·网络·安全·等保一体机
BullSmall2 小时前
window系统上报Cannot assign requested address
网络·功能测试
杨云龙UP3 小时前
MySQL Host is blocked because of many connection errors 导致 JDBC 连接失败排查与解决
linux·运维·网络·数据库·sql·mysql·登录失败
执念WRD3 小时前
Fastjson 1.2.83 RCE 漏洞利用
网络·安全·网络安全