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
do
     command
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/$DIR
 for j in {1..10};do
 touch $RANDOM.log
 done
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/null
  if [ $? -eq 0 ];then
  echo "${i} 用户已存在!"
  else
  useradd $i
  echo 123456 | passwd --stdin $i &> /dev/null
    if [ $? -eq 0 ];then
    echo "${i} 用户新建成功!"
    else
    echo "${i} 用户新建失败!"
    fi
  fi
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}
do
    for i in {1..9}
    do
    echo -e "*\c"     #\c换行
    done
echo
done

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

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

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

#!/bin/bash
#j为行数  i为列数
for j in {1..9}
do
    for i in `seq $j`
    do
    echo -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  变量名 
do
     command
done

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

for ((expr1;expr2;expr3))
do
       command
done

expr1:定义变量并赋初值
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++))
do
    for ((j=1;j<=i;j++))
    do
    echo -e "${i}x${j}=$[i*j] \t\c"
    done
echo
done

5、for循环总结

执行机制:

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

三、while循环语句

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

 1、while循环语句格式

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

2、while死循环

死循环一:

while  :
do
  command
done

死循环二:

while true
do
    command
done

死循环三:

#写一个永远为真的表达式,1等于1这个条件永远为真,所以这个脚本会一直循环下去
while [ 1 -eq 1 ]  
do
    command
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/null

echo 123456|passwd --stdin stu$xz  &>/dev/null
    if [ $? -eq 0 ];then
    echo "${i} 用户新建成功!"
    else
    echo "${i} 用户新建失败!"
    fi
let xz++
done

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

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

案例三

猜价格游戏

#!/bin/bash

g=`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/s
    IN=$[$[$NEW_IN - $OLD_IN]/1024]$DW
    OUT=$[$[$NEW_OUT - $OLD_OUT]/1024]$DW
    sleep 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/bash

until false
do
    command
done

死循环二:

#写一个永远为假的表达式,1等于2这个条件永远为假,所以这个脚本会一直循环下去
until [ 1 -eq 2 ]  
do
    command
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
done

echo $2 | write $1

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

概念性——数据库简介

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 概念性——数据库简介 介绍 数据对于当今许多应用程序和网站的运行至关重要。对热门视频的评论、多人游戏中分…

精酿啤酒的原料供应链:质量控制的重要性

对于啤酒的品质和口感&#xff0c;原料供应链的质量控制是重要的。特别是对于Fendi Club这样品质的啤酒&#xff0c;其原料供应链的管理更是重中之重。下面&#xff0c;我们将深入探讨Fendi Club啤酒如何对其原料供应链进行质量控制&#xff0c;以确保啤酒的品质和口感。 首先&…

专业144总分410+华南理工大学811信号与系统考研经验华工电子信息与通信

今年专业811信号与系统144&#xff08;二战&#xff0c;感谢信息通信Jenny老师专业课对我的巨大提高&#xff0c;第一年自己复习只考了90&#xff0c;主要栽专业课和数学&#xff09;总分410含泪&#xff08;二战的同学都知道苦&#xff0c;成功来之不易&#xff09;考上华南理…

【IC设计】Vivado单口RAM的使用和时序分析

文章目录 创建单口RAM IPIP Catalog中选择单口RAM IPBasicPort A OptionsOther Options 仿真找到IP例化原语编写Testbench 波形分析 创建单口RAM IP IP Catalog中选择单口RAM IP Basic Port A Options Other Options 仿真 找到IP例化原语 IP Sources-Instantiation Template…

深度了解TCP/IP模型

网络通信是现代社会不可或缺的一部分&#xff0c;而TCP/IP模型作为网络通信的基石&#xff0c;扮演着至关重要的角色。本文将深入探讨TCP/IP模型的概念、结构及其在网络通信中的作用&#xff0c;为读者提供全面的了解。 一.TCP/IP模型简介 TCP/IP模型是一个网络通信协议体系&a…

Android Settings 按住电源按钮

如题&#xff0c;Android 原生 Settings 里有个 按住电源按钮 的选项&#xff0c;可以设置按住电源按钮的操作。 按住电源按钮 两个选项的 UI 是分离的&#xff0c; 电源菜单 代码在 packages/apps/Settings/src/com/android/settings/gestures/LongPressPowerForPowerMen…

使用WebDriver采样器将JMeter与Selenium集成

第一步&#xff1a; 在JMeter中添加Selenium / WebDriver插件 第二步&#xff1a; 创建一条测试计划–添加线程组 添加配置元素 - jpgc - WebDriver Sampler 添加配置元素 - jpgc - Chrome Driver Config 并且添加监听器查看结果树 第三步&#xff1a; 下载 chromedriver…

威士忌的类型:从单一麦芽到混合威士忌

威士忌&#xff0c;这种源自苏格兰的特别蒸馏酒&#xff0c;如今已在全球范围内赢得了无数赞誉。其类型多样&#xff0c;从单一麦芽到混合威士忌&#xff0c;每一种都有其特别的特点和风味。本文将深入探讨不同类型的威士忌&#xff0c;以雷盛537威士忌的实例&#xff0c;分析其…

AWS 专题学习 P9 (API Gateway、Cognito、Serverless SA)

文章目录 专题总览API GatewayAPI Gateway – 高级集成API Gateway – AWS 服务集成API Gateway - Endpoint TypesAPI Gateway – 安全 AWS Step Functions&#xff08;AWS 步骤函数&#xff09;Amazon Cognito&#xff08;认证服务&#xff09;Cognito User Pools (CUP) – 用…

【云原生】Docker网络模式和Cgroup资源限制

目录 一、Docker 网络实现原理 二、Docker 的网络模式 #网络模式详解&#xff1a; 第一种&#xff1a;host模式 第二种&#xff1a;bridge模式 第三种&#xff1a;container模式 第四种&#xff1a;none模式 第五种&#xff1a;自定义网络 三、Cgroup资源控制 第一种&a…

中断与事件区别

自记&#xff1a; 以外部中断举例&#xff1a; 这张图是一条外部中断线或外部事件线的示意图, 图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套. 图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚进入,经过编号2的边…

Java实现校园疫情防控管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生2.2 老师2.3 学校管理部门 三、系统展示四、核心代码4.1 新增健康情况上报4.2 查询健康咨询4.3 新增离返校申请4.4 查询防疫物资4.5 查询防控宣传数据 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBoot…

php实现多进程的几种方式

目录 一&#xff1a;使用pcntl扩展库 二&#xff1a;使用Swoole扩展 三&#xff1a;使用多进程模式PHP-FPM 在PHP中实现多进程主要有以下几种方式&#xff1a; 一&#xff1a;使用pcntl扩展库 pcntl扩展库提供了多线程相关的函数&#xff0c;如pcntl_fork()用于创建子进程…

vue常用指令(v-show)

一、v-show 指令 作用: 根据真假值,切换元素的显示状态 二、代码演示 1、v-show 绑定判断条件后&#xff0c;根据布尔值决定是否显示图片 不显示图片 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><…

pve8.1 安装、创建centos7虚拟机及配置

之前创建虚拟机centos7时&#xff0c;硬盘分配太大了&#xff0c;做成模板后无法进行修改了&#xff0c;安装完pve8.1后&#xff0c;强迫症犯了重新创建一下顺便记录一下配置过程。由于目前centos7还是生产用的比较多的版本所以本次还是安装centos7.9版本。 一、下载镜像 下载…

mysql 多版本并发控制mvcc

行级锁的一个变种避免了加锁&#xff0c;开销低非阻塞读操作&#xff0c;写操作是行级原理&#xff1a;使用数据在某个时间点的快照实现&#xff0c;不同事务在同一个时间可以看到同一个表中的不同数据。分类&#xff1a;乐观&#xff0c;悲观在一行中存储更多数据&#xff0c;…

VR数字展厅,平面静态跨越到3D立体化时代

近些年&#xff0c;VR的概念被越来越多的人提起&#xff0c;较为常见的形式就是VR数字展厅。VR数字展厅的出现&#xff0c;让各地以及各行业的展厅展馆的呈现和宣传都发生了很大的改变和革新&#xff0c;同时也意味着展览传播的方式不再局限于原来的图文、视频&#xff0c;而是…

统计学-R语言-7.4

文章目录 前言非参数检验两个独立样本的Mann-Whitney检验 练习 前言 本片是对非参数检验最后的介绍。 非参数检验 两个独立样本的Mann-Whitney检验 Mann -Whitney检验也称为Mann- Whitney U检验&#xff08;Mann-Whitney U test&#xff09;或称为 Wilcoxon秩和检验&#xf…

C++ Qt day2

自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include <io…

UDP 的报文结构和注意事项

1. UDP的特点 1.无连接 就像发短信给对方&#xff0c;只需要对方的端口和IP地址。不需要连接。 2.不可靠传输 没有任何安全机制&#xff0c;发送端发送数据报以后&#xff0c;如果因为⽹络故障该段⽆法发到对⽅&#xff0c;UDP协议层也不会给应⽤层返回任何错误信息。 3.面向…