shell脚本基础之循环语句

目录

一、循环语句的概念

二、for循环语句

1、列表循环

2、列表for循环案例大全

案例一

案例二

案例三

案例四

案例五

案例六

案例七

案例八

3、不带列表循环

4、类似C语言风格的for循环

5、for循环总结

三、while循环语句

1、while循环语句格式

2、while死循环

3、跳出循环

3.1 exit

3.2 break

3.3 continue

3.4 区别

4、while循环案例大全

案例一

案例二

案例三

案例四

案例五

四、until循环语句

1、until循环语句格式

2、until死循环

3、until循环案例大全

案例一

案例二 


一、循环语句的概念

shell脚本的循环语句用于重复执行一系列命令或操作。它允许您根据条件或计数器来控制循环的执行次数,通常有进入循环的条件和退出循环的条件

重复运行次数:

  • 循环次数事先已知,如for循环语句

  • 循环次数事先未知,如while、until循环语句

二、for循环语句

for循环用于遍历一个列表或范围内的元素,并对每个元素执行相同的操作。通常使用for关键字和in关键字来指定要遍历的列表

1、列表循环

for  变量名  in   list
docommand
done

注:

list支持{ …… } ` 命令 `(即调用命令执行的结果)

注:

command:可调用前面的变量,也可直接使用命令

2、列表for循环案例大全

案例一

将/opt下所有文件的后缀改为.txt

#!/bin/bash
#将/opt下所有文件的后缀改为.txt
for i in `ls /opt`
do
name=`echo $i|cut -d"." -f1`
mv /opt/$i /opt/${name}.txt
done

案例二

如何实现批量修改格式为:2220_陈辰.jpg(示例)

步骤一: 将name.txt的内容导出成文件

#!/bin/bash
#将文件里的内容导出成文件,方便改名的操作
for i in `cat /opt/name.txt`
do
touch /data/$i
done

步骤二:批量改名 

#!/bin/bash
for i in `ls /data`
do
a=`echo ${i} | cut -d "_" -f1`
b=`echo ${i} | cut -d "_" -f2`
mv /data/${i} /data/${b}_${a}.jpg
done

案例三

步骤一:模拟环境,生成日期日志

#!/bin/bash
#模拟环境,生成日期日志
PDIR=/data/test
for i in {1..365};do DIR=`date -d "-$i day" +%F`mkdir -pv $PDIR/$DIR cd $PDIR/$DIRfor j in {1..10};dotouch $RANDOM.logdone
done

现在如何批量将日志分层放置,实现这样的放置格式:年-月-->日期-->日志

步骤二:日志分层放置 

#!/bin/bash
a=/data/test
cd $a || { echo "无法进入 $a";exit 1;}
for i in *;do
YYYY_MM=`echo $i | cut -d"-" -f1,2`
DD=`echo $i |cut -d"-" -f3`
[ -d $YYYY_MM/$DD ] || mkdir -p $YYYY_MM/$DD &> /dev/null
mv $i/* $YYYY_MM/$DD
done
rm -rf $a/*-*-*

案例四

计算

(1)计算1+2+3+4....+100的和

方法一: 

#!/bin/bash
for i in {1..100}
do
sum=$[i+sum]
done
echo "求总和结果为:$sum"

方法二: 

sum=0
for i in `seq 100`
do
let sum+=$i
done
echo "求总和结果为:$sum"

(2) 计算1~100内的奇数和

方法一:

#!/bin/bash
for i in {1..100..2}
do
sum=$[i+sum]
done
echo "求奇数和结果为:$sum"

方法二:

sum=0
for i in `seq 1 2 100`
do
let sum+=$i
done
echo "求奇数和结果为:$sum"

(3)计算1~100内的偶数和

方法一:

#!/bin/bash
for i in {0..100..2}
do
sum=$[i+sum]
done
echo "求偶数和结果为:$sum"

 方法二:

sum=0
for i in `seq 0 2 100`
do
let sum+=$i
done
echo "求偶数和结果为:$sum"

案例五

判断文件内的用户是否存在,如果用户不存在需要新建

#!/bin/bash
#判断/data/name.txt内的用户是否存在,如果用户不存在需要新建
for i in `cat /data/name.txt`
do
id $i &> /dev/nullif [ $? -eq 0 ];thenecho "${i} 用户已存在!"elseuseradd $iecho 123456 | passwd --stdin $i &> /dev/nullif [ $? -eq 0 ];thenecho "${i} 用户新建成功!"elseecho "${i} 用户新建失败!"fifi
done

案例六

检测172.16.12.0网段的主机网络是否能联通

方法一:

#!/bin/bash
{
for i in {1..254}
do
ping -c2 -W2 172.16.12.$i &>/dev/null
if [ $? -eq 0 ];then
echo "172.16.12.$i is online" >> /data/on.txt
else
echo "172.16.12.$i is offline" >> /data/off.txt
fi
done
}&

方法二:

#!/bin/bash
for i in {1..254}
do
{
ping -c2 -W2 172.16.12.$i &>/dev/null && echo "172.16.12.$i is online" >> /data/on.txt || echo "172.16.12.$i is offline" >> /data/off.txt
}&
done

案例七

(1)如何使用“ ”打印长方形

#!/bin/bash
#j为行数  i为列数
for j in {1..9}
dofor i in {1..9}doecho -e "*\c"     #\c换行done
echo
done

(2)如何使用“ ”打印正三角形

#!/bin/bash
#j为行数  i为列数
for j in {1..9}
dofor i in `seq $j`doecho -e "*\c"done
echo  #换行
done

(3)如何打印正序九九乘法表

#!/bin/bash
#j为行数  i为列数
for j in {1..9}
dofor i in `seq $j`doecho -e "${i}x${j}=$[i*j] \t\c"#\t tab键可以对齐done
echo
done

(4)如何打印倒序九九乘法表

#!/bin/bash
for j in {1..9}
do
for i in `seq $[10-$j]`
do
echo -ne " ${i}x`echo $[10-j]`=$[(10 -j)*i]\t"
done
echo
done

案例八

编写垃圾箱脚本

#!/bin/bash
WARNING_COLOR="echo -e \E[1;31m"
END="\E[0m"DIR=/tmp/`date +%F_%H-%M-%S`mkdir  $DIR
mv $*  $DIR       
${WARNING_COLOR} Move $* to $DIR $END

3、不带列表循环

使用较少,了解即可,注意一定要在运行脚本时添加列表参数

for  变量名 
docommand
done

4、类似C语言风格的for循环

for ((expr1;expr2;expr3))
docommand
doneexpr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出
++ 自身变量+1
--自身变量-1
+=5自身变量+5
-=5自身变量-5
*=5 自身变量*5
/=5  自身变量/5
%=5 自身变量%5

如何利用类似C语言风格的for循环语句,计算1+2+3+4....+100的和

#!/bin/bash
sum=0
for ((i=0;i<=100;i++))
do
let sum+=i
done
echo $sum

如何利用类似C语言风格的for循环语句,打印出九九乘法表

#!/bin/bash
for ((i=1;i<=9;i++))
dofor ((j=1;j<=i;j++))doecho -e "${i}x${j}=$[i*j] \t\c"done
echo
done

5、for循环总结

执行机制:

  • 依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束
  • 如果省略 [in WORDS ... ] ,此时使用位置参数变量 in "$@"

三、while循环语句

while循环在给定条件为真时重复执行一系列操作。循环会在每次迭代之前检查条件是否满足,如果满足则执行操作

 1、while循环语句格式

while条件判断为真的表达式
docommand
done

2、while死循环

死循环一:

while  :
docommand
done

死循环二:

while true
docommand
done

死循环三:

#写一个永远为真的表达式,1等于1这个条件永远为真,所以这个脚本会一直循环下去
while [ 1 -eq 1 ]  
docommand
done

3、跳出循环

3.1 exit

exit命令用于终止整个脚本的执行。可选的参数n是一个整数值,表示脚本的退出状态。通常,0表示成功,非零值表示出现了错误

exit  n     #n指定shell的退出状态码
#0表示成功,非0表示有错误发生
exit 1      #表示脚本执行时发生了某种错误

3.2 break

break命令用于跳出循环,例如forwhileuntil循环。当遇到break时,程序会立即跳出当前的循环结构,并执行循环后面的语句

break     #跳出当前所处的循环
break  1  #跳出一层循环
break  2  #跳出二层循环
break  n  #跳出n层循环

3.3 continue

continue命令用于结束当前循环的迭代,然后继续下一次迭代。当程序执行到continue时,会立即停止当前迭代并进入下一次循环迭代

continue

3.4 区别

  • exit用于完全退出脚本的执行,而breakcontinue用于控制循环结构。
  • break用于完全退出当前循环,而continue用于跳过当前迭代,继续下一次迭代

4、while循环案例大全

案例一

计算1+2+3+4....+100的和

#!/bin/bash
i=0
sum=0
while [ $i -le 100 ]
do
sum=$[i+sum]
let i++
done
echo $sum

案例二

批量添加以stu开头用户,按数字顺序进行编号,一共添加20个用户,即stu1、stu2……stu20,初始密码均设为123456

#!/bin/bash
xz=1
while [ $xz -le 20 ]
do
useradd stu$xz  &>/dev/nullecho 123456|passwd --stdin stu$xz  &>/dev/nullif [ $? -eq 0 ];thenecho "${i} 用户新建成功!"elseecho "${i} 用户新建失败!"fi
let xz++
done

批量删除以stu开头,按数字顺序进行编号的用户,一共删除20个用户,即stu1、stu2……stu20。

#!/bin/bash
xz=1
while [ $xz -le 20 ]
do
userdel stu$xz  &>/dev/nullif [ $? -eq 0 ];thenecho "${i} 用户删除成功!"elseecho "${i} 用户删除失败!"fi
let xz++
done

案例三

猜价格游戏

#!/bin/bashg=`echo $[RANDOM%800+1]`
time=0
#死循环
while :
do
read -p "请输入商品的价格(1-800):" m
let time++
if [ $g -eq $m ];then
echo "恭喜你猜中啦!商品价格为:${m};您一共猜了${time}次"
exit
#跳出循环
elif [ $m -gt $g -a $m -le 800 -a $m -gt 0 ];then
echo "您猜测的价格过高!"
elif [ $m -lt $g -a $m -le 800 -a $m -gt 0 ];then
echo "您猜测的价格过低!"
else
echo "输入有误!请重新输入!"
fi
done

案例四

网络流量速度计算

#!/bin/bash
#定义流量的单位
DW=kb/s
#死循环
while :
do#定义某一时间点的提取ens33网卡流量的数值OLD_IN=`ifconfig ens33|grep "RX p"|awk '{print $3}'`OLD_OUT=`ifconfig ens33|grep "TX p"|awk '{print $3}'`#定义下一个时间点的提取ens33网卡流量数值NEW_IN=`ifconfig ens33|grep "RX p"|awk '{print $3}'`NEW_OUT=`ifconfig ens33|grep "TX p"|awk '{print $3}'`#进行流量的计算,默认是Bytes,转换成kb/sIN=$[$[$NEW_IN - $OLD_IN]/1024]$DWOUT=$[$[$NEW_OUT - $OLD_OUT]/1024]$DWsleep 5#打印对应的值echo -e "接收数据:${IN}\t发送数据:$OUT"
done

案例五

实时监控本机内存和硬盘剩余空间,剩余内存小于500M、根分区剩余空间小于1000M时,发送报警邮件给root管理员

#!/bin/bash
#提取根分区剩余空间
disk_size=`df | awk '/\//{print $4}'`
#提取内存剩余空间
mem_size=`free | awk '/Mem/{print $4}'`
while :
do
#注意内存和磁盘提取空间的大小都是以Kb为单位
if [ $disk_size -le 512000 -a $mem_size -le 1024000 ];then
mail -s Warning root <<EOF
Insufficient resources, 资源不足
EOF
fi
done

四、until循环语句

until循环与while循环类似,但在给定条件为假时重复执行一系列操作。循环会在每次迭代之前检查条件是否不满足,如果不满足则执行操作

 1、until循环语句格式

until 条件测试操作
do
命令序列
done

2、until死循环

死循环一:

#!/bin/bashuntil false
docommand
done

死循环二:

#写一个永远为假的表达式,1等于2这个条件永远为假,所以这个脚本会一直循环下去
until [ 1 -eq 2 ]  
docommand
done

3、until循环案例大全

案例一

计算1+2+3+4....+100的和

#!/bin/bash
sum=0
i=0
until [ $i -gt 100 ]
do
let sum=$i+$sum
let i++
done
echo sum=$sum

案例二 

实现在不同终端上的用户登录到同一个服务器,能互发消息

#!/bin/bash
#判断输出的参数是否满足条件
if [ $# -lt 2 ];then
echo "位置参数不足,请在脚本后添加用户名及需要发送的消息"
exit 1
fi#判断用户是否存在
if grep "^$1" /etc/passwd &>/dev/null ;then
echo "该用户存在!"
else
echo "该用户不存在!"
exit 1
fi#判断用户是否在线
until who | grep $1 &> /dev/null
do
echo "该用户不在线!"
sleep 5
doneecho $2 | write $1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/655032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GMS测试BTSfail-CVE-2022-20451

描述&#xff1a; 项目需要过GMS兼容性测试&#xff0c;BTS这块我们环境没有&#xff0c;送检之后出现了一个BTS的Alert&#xff0c;这个是必须要解决的。下面的warning可以不考虑。 这个是patch问题&#xff0c;根据代理提供的pdf文件找到一个id:为A-235098883的补丁&#xf…

利用ChatGPT实现副业赚钱的10个方法

现今ChatGPT的热潮越来越高&#xff0c;很多程序员也把目光转向了如何靠ChatGPT赚钱&#xff0c;而那些掌握先机的程序员已经通过这一副业赚到了人生中的第一桶金。 如果你也对ChatGPT感兴趣&#xff0c;但还没有找到程序员靠ChatGPT实现营收&#xff0c;增加副业收入的方法&a…

web渗透测试-Server2225-(环境+解析)

1、访问目标IP,打开第1题,根据页面提示,将获取的flag提交。提交格式:flag{xxx}(提交花括号里面的字段) 给出了如上代码,很明显,flag在flag.php文件内。 REQUEST方法既可以接受GET方法,也可以接受POST方法,方便起见,我们选择GET方法。 eval函数 eval() 函数把字符串…

电商平台低价乱价?电商平台API接口接入,实时获取商品价格

​和传统线下渠道对比线上电商运营手段多样和方便&#xff0c;电商会经常采用价格策略以吸引消费者&#xff0c;这种灵活而频繁的价格变动对供货商的渠道管理提出了前所未有的挑战&#xff0c;实时监测电商的价格变动对于品牌商和电商平台是非常重要的环节。而促销活动设计和日…

当包容结构体遇见灵活的内存管理

&#x1f308;个人主页&#xff1a;小田爱学编程 &#x1f525; 系列专栏&#xff1a;c语言从基础到进阶 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于c语言的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x…

Python算法题集_和为K的子数组

本文为Python算法题集之一的代码示例 题目560&#xff1a;和为K的子数组 说明&#xff1a;给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nu…

JavaScript DOM属性和方法之event事件对象

event对象代表事件的状态&#xff0c;比如事件在其中发生的元素&#xff0c;键盘按键的状态、鼠标的位置、鼠标按钮的状态&#xff0c;事件通常与函数结合使用&#xff0c;函数不会在事件发生前被执行&#xff0c;只有当事件被触发的时候才会执行函数。 一、句柄事件 HTML5的…

【代码能力提升 | 代码阅读学习】分析 VoxelNet 的 主干

文章目录 前言代码分析VoxelNet model2.数据处理2.1单个样本处理2.2处理成batch 最后&#xff0c;附上我一步步调试代码&#xff0c;到3D-conv 前言 代码来自&#xff1a;https://github.com/skyhehe123/VoxelNet-pytorch 其中 测试数据来自&#xff1a;https://github.com/ga…

春节寄快递贵?想要便宜寄快递?那是你没找到寄快递便宜的渠道!

春节将至&#xff0c;公司会发放一大批的年货礼品给员工们&#xff0c;来聊表这一年来的勤恳工作的心意。但是想要拿走这么多的年货&#xff0c;可不是一件容易的事情啊&#xff0c;这时候我们可以通过邮寄的方式把东西邮寄走&#xff0c;是不是省了很多事呢&#xff0c;不仅回…

如何过有「松弛感」的生活?

最近网上有一个词很流行&#xff0c;叫做「松弛感」。最早的出处似乎是这么一条微博&#xff1a;博主见到一家人出门旅游&#xff0c;行李全部被退回&#xff0c;空手抵达目的地&#xff0c;竟然没人紧张和生气&#xff0c;而是重新安排好行李后继续开心聊天&#xff0c;全程非…

Redis -- 前置知识

目录 简要 分布式系统 负载均衡 引入缓存 数据库分表 微服务 小结 简要 redis是存储数据在内存中, 定义变量就是在内存中, 但是redis是在分布式系统中, 才能真正发挥威力, 如果只是单机程序, 那么直接通过变量来存储数据的方式将是最优的选择. …

Unity 解释器模式(实例详解)

文章目录 示例1&#xff1a;基础解释器结构示例2&#xff1a;小于表达式&#xff08;LessThanExpression&#xff09;示例3&#xff1a;逻辑或表达式&#xff08;OrExpression&#xff09;示例4&#xff1a;逻辑非表达式&#xff08;NotExpression&#xff09;示例5&#xff1a…

DeepLearningSystem:开启深度学习之旅的全方位指南,一款深度学习系统性开源课程项目!

在当今这个数据驱动的时代&#xff0c;深度学习技术 已经成为了科技领域的一个重要分支。 对于有志于掌握这一技术的专业人士和学生来说&#xff0c;有一个项目值得特别关注——由chenzomi12开发的“深度学习系统”课程。 Star&#xff1a;6.2k GitHub&#xff1a;https://gi…

美睫师睫毛嫁接零基础学习,日式美睫与开花嫁接实战教学

一、教程描述 大家都说女人的钱好挣&#xff0c;这是因为每个女人在每年&#xff0c;都要花很多钱来打扮自己。本套教程是关于日式美睫和开花嫁接的&#xff0c;从零基础学习到店铺经营都有涉及&#xff0c;就做美睫和睫毛嫁接这两项业务&#xff0c;月收入万元以上应该问题不…

系统引导程序 Boot Loader——学习笔记

基于嵌入式Linux 的完整系统软件由三个部分组成&#xff1a;系统引导程序、Linux 操作系统内核和文件系统。 系统引导程序 Boot Loader 是系统加电后运行的第一段软件代码&#xff0c;它的作用是加载操作系统或者其他程序到内存中&#xff0c;并将控制权交给它们。 Boot Load…

JMeter性能测试实战

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

C语言——O / 动态内存管理

一、为什么要有动态内存分配 我们已经掌握的内存开辟⽅式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的⽅式有两个特点&#xff1a; • 空间开辟⼤⼩是固定的。 • 数组在申明的时候&am…

RabbitMQ之死信交换机

前言 消息队列是分布式系统中常用的组件&#xff0c;用于异步通信、解耦和提高系统可靠性。然而&#xff0c;在实际应用中&#xff0c;难免会遇到一些异常情况&#xff0c;例如消息处理失败、超时等。为了更好地处理这些异常情况&#xff0c;死信交换机&#xff08;Dead Lette…

AS自治系统中的路由协议---RIP、OSPF、BGP

一、AS --- 自治系统 将网络分块管理 --- 由单一的机构或组织所管理 的一系列IP网络及其设备的集合 AS的管理&#xff1a;为了方便对AS进行管理&#xff0c;我们给AS设计了一个编号称为AS 号 --- 16位二进制构成 --- 0 - 65535 ---- 目前也存在拓展版的AS 号 --- 32位二进制构…

C++-类和对象(1)

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1 访问限定符 关于C中struct和class的区别&#xff1a; 4.2 封装 1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&…