Linux中shell脚本——for、while循环及脚本练习

news2024/11/18 23:34:46

目录

一.for循环

1.1.基本格式

1.2.类C语言格式

二.while循环

2.1.基本格式

2.2.死循环语句

三.跳出循环

3.1.continue跳出循环

3.2.break跳出循环

四.常用循环

4.1.循环打印九九乘法表

4.2.循环ping测试某个网段网络连通性

4.3.while死循环实现猜数字游戏

4.4.数字累加脚本(1-100) 


一.for循环

1.1.基本格式

for   变量名称(注意是名称不是变量$等)    [  in   名称范围  ] (可以不写)

do   

执行内容    若满足循环则做什么动作

done    for循环结束标志

练习:

vim  sb.sh              #创建脚本sb.sh
脚本内容:
#!/bin/bash
for  i   in  {1..10}    #for循环10次,第一次i=1,第二次i=2以此类推直到i=10
do
echo "$i"               #循环动作,每次输出$i 
done                    #for语句结束标志

bash  sb.sh             #调用shell执行脚本sb.sh
 

 

1.2.类C语言格式

for (( 表达式1 ;表达式2;表达式3   ))

do

执行内容         #若满足循环则做什么动作

done                #for循环结束标志

表达式1:定义变量并赋值

表达式2:决定是否循环

表达式3:决定循环变量如何改变,决定循环什么时候结束

练习:

vim kk.sh                  #创建脚本kk.sh
脚本内容:
#!/bin/bash
for(( i=0;i<=10;i++ ))     #定义for循环i变量初始值为0,循环条件i小于等于10,每循环一次i自加1
do
echo "$i"                  #for循环每循环一次执行一次输出$i
done                       #for语句结束标志

bash kk.sh                 #调用shell执行脚本

 

二.while循环

2.1.基本格式

用于不知道循环次数,需要主动结束循环或达到条件结束循环。

while   [ 判断条件] 使用while循环满足条件执行do,不满足不执行 

do       

执行动作   while循环执行动作

done         while循环结束标志

练习:

vim  ll.sh               #创建脚本ll.sh
脚本内容:
#!/bin/bash
i=0
while [ $i -le 10  ]     #变量i小于等于10时执行while循环
do
echo "$i"                #循环执行内容,每循环一次打印$i
let i++                  #每循环一次计算一次i++ 即i自己+1
done                     #while语句结束标志 

bash  ll.sh              #调用bash执行ll.sh脚本

2.2.死循环语句

①while  [1  -eq  1]            #判断条件写一个永久为真的条件

    do                                 # 一直执行do内的命令

    done                     

②while  true                     #直接写判断条件为真

    do                                 #一直执行do内的命令

    done                         

③while :                           #判断条件为冒号也表示死循环

    do                                 # 一直执行do内的命令

    done                             #while语句结束标志

三.跳出循环

3.1.continue跳出循环

表示满足continue条件时跳出循环,但是不影响后续循环执行

vim qq.sh         #创建脚本qq.sh
脚本内容:
#!/bin/bash
for i in {1..5}  #for循环5次从i=1开始到i=5
do
if [ $i -eq 3 ]  #if判断语句,若$1等于3则执行then的内容
then 
continue         #当$i=4时跳出循环但不影响后面循环  
fi               #结束if语句
echo "$i"        #没执行一次for循环输出一次$i
done             #for循环结束语句

bash qq.sh       #调用shell执行脚本

 

3.2.break跳出循环

在某个循环中遇到break直接结束此次循环,但是不影响外边嵌套的循环。

break  [数字] 结束数字中的几次循环,若为2则结束自己所在循环和外边嵌套的一层循环,若为3则结束自己所在循环和外边嵌套的2层循环

举例:
vim   o.sh     #创建o.sh脚本
脚本内容:
#!/bin/bash
for j in {1..3}      #第一层for循环,j=1,2,3各执行一次do的内容
do                   #第一层for循环的执行内容
    for i in {1..5}  #第二层for循环,i=1,2,3,4,5各执行一次do的内容
    do               #第二层for循环的执行内容  
        if [ $i -eq 3 ]  #第二层for循环中添加的if判断语句,当$i=3是执行then内容
        then                
        break            #第二层for循环判断语句执行命令,break结束循环
        fi               #if语句结束
    echo "$i"            #第二层for循环语句执行每循环一次输出$i
    done                 #第二层for循环语句结束标志                
done                     #第一层for循环语句结束标志


bash o.sh                #调用bash执行o.sh脚本
执行结果:第二层执行在$i=3是结束了循环,所以只能输出1和2,
第一层for循环是循环3次,所以输出了3次。
1
2
1
2
1
2

 

四.常用循环

4.1.循环打印九九乘法表

①第一步for循环打印一行9个*号

②第二步再添加一个for循环打印一个9行9列的*号正方形

②第三步将*号正方形斜砍一般形成9*9乘法表的基本格式

③第四步将*号9*9乘法表格式用乘法算式替换

第一步:
vim jj.sh              #创建jj.sh脚本
脚本内容:
#!/bin/bash
for i in {1..9}        #for循环9次从i=1开始
do
echo -n "*"            #每循环一次打印一个*,echo  -n参数表示不换行
done                   #此for循环语句结束
bash  jj.sh            #调用shell执行脚本
执行结果:
*********



第二步:
vim jj.sh              #编辑jj.sh脚本
脚本内容:
#!/bin/bash
for  j  in  {1..9}     #添加打印列循环,循环9次从j=1开始  
do                     #j循环时做do中的内容    
    for i in {1..9}    #第一步for循环内容不变
    do
    echo -n "*"
    done
echo                   #列循环每循环一次打印一行空格进行换行
done                   #列循环for语句结束标志
bash  jj.sh            #调用shell执行脚本
执行结果:
*********
*********
*********
*********
*********
*********
*********
*********
*********


第三步:
vim jj.sh              #编辑jj.sh脚本
脚本内容:
#!/bin/bash
for  j  in  {1..9}     #列循环内容不变  
do                         
    for i in `seq $j`  #修改行循环i的取值范围为展开变量j,即当j=1时i取值只有1,所以循环一次。当 
                       j=2时,i取值为1和2,所以i=1和i=2各循环一次,循环2次。以此类推到j=9
    do
    echo -n "*"
    done
echo                   
done                   
bash  jj.sh            #调用shell执行脚本
执行结果:
*
**
***
****
*****
******
*******
********
*********




第四步:
vim jj.sh                           #编辑jj.sh脚本
脚本内容:
#!/bin/bash
for  j  in  {1..9}                  #列循环内容不变  
do
    for i in `seq $j`
    do
    echo -ne "$j*$i=$[ $j*$i ]\t"   #行输出内容修改为9*9算式和结果。$[ ]表示计算里面的正整数结果,echo -e参数表示调用转义符,\t表示制表符即循环时输出一个tab键
    done
echo                   
done                   
bash  jj.sh                         #调用shell执行脚本
输出结果:
1*1=1	
2*1=2	2*2=4	
3*1=3	3*2=6	3*3=9	
4*1=4	4*2=8	4*3=12	4*4=16	
5*1=5	5*2=10	5*3=15	5*4=20	5*5=25	
6*1=6	6*2=12	6*3=18	6*4=24	6*5=30	6*6=36	
7*1=7	7*2=14	7*3=21	7*4=28	7*5=35	7*6=42	7*7=49	
8*1=8	8*2=16	8*3=24	8*4=32	8*5=40	8*6=48	8*7=56	8*8=64	
9*1=9	9*2=18	9*3=27	9*4=36	9*5=45	9*6=54	9*7=63	9*8=72	9*9=81

4.2.循环ping测试某个网段网络连通性

需求:测试用户输入的某个32位网段是否可以ping通,且若可以ping通将此ip输出到文件host.txt中。

①第一步读取用户输入的32位网段。

②使用for循环生成用户输入网段的所有ip。

③使用ping命令在循环中测试用户输入网段内所有ip,注意指定ping包个数和超时结束时间,否则一直ping。

④将循环检查网络连通性放入后台执行。

vim p.sh    #创建p.sh脚本
脚本内容:
#!/bin/bash
read -p "请输入需要测试的网段,格式为(192.168.47.):" ip #读取用户输入内容为变量ip
for i in {1..254}               #for循环254次,从i=1开始
do
{                               #将{}内容当成一个整体
ping -c2 -w2 $ip$i &>/dev/null  #指定ping包为2个超时结束时间为2秒且将产生的内容全部放入null垃圾桶中,&符号表示错误输出也放入null垃圾桶中
    if [ $? -eq 0 ]  #if条件判断如果上一个循环执行的命令是正确的则$?返回0,若等于0执行then的内容
    then
    echo "$ip$i  is  online" #if条件成立执行打印
    echo $ip$i >> host.txt   #将if条件成立的ip追加到host.txt文件中
    else
    echo "$ip$i  is  offline" #if添加判断不成立执行打印
    fi
}&                            #将循环成立的内容放入后台执行
done
wait                          #执行结束不等待直接退出

 

4.3.while死循环实现猜数字游戏

需求:生成随机1-100的价格给用户猜测直到猜对结束游戏,并统计用户猜对猜了几次。

①第一步生成一个随机1-100数字

②第二步使用while循环写一个死循环直到用户猜对才结束循环

③在执行循环的过程中统计循环执行次数并输出

vim e.sh         #创建脚本e.sh
脚本内容:
#!/bin/bash
num=`echo $[ RANDOM%100+1 ]`  #$[RANDOM]是一个0-32767的随机数,%100+1除100取余+1表示生成0-100随机数
time=0           #定义猜对次数变量time初始值为0
while true       #生成while死循环
do               #循环动作为do内的内容
let time++       #每循环一次time变量自加1
read -p "请输入您猜测的数字,范围(1-100):" user #读取用户输入的内容为变量user
    if [ $user -eq $num ]    #条件判断分支1,如果用户输入等于随机生成执行then动作
    then 
    echo "您猜对了,您一共猜测了$time次"  #if分支1条件成立执行输出
    break                               #if分支1条件成立则结束本次循环
    elif [ $user -gt $num  ] #条件判断分支2,如果用户输入大于随机生成执行本次then动作
    then
    echo "您猜大了,请往小猜"  #条件判断分支2成立提示用户猜大了
    elif [ $user -lt $num ]  #条件判断分支3,如果用户输入小于随机生成执行本次then动作
    then 
    echo "您猜小了,请往大猜"  #条件判断分支3成立提示用户猜小了
    fi                       #if语句结束
done


bash  e.sh                   #调用bash执行脚本
执行结果
请输入您猜测的数字范围(1-100):50
您猜小了,请往大猜
请输入您猜测的数字范围(1-100):60
您猜小了,请往大猜
请输入您猜测的数字范围(1-100):70
您猜大了,请往小猜
请输入您猜测的数字范围(1-100):65
您猜大了,请往小猜
请输入您猜测的数字范围(1-100):62
您猜小了,请往大猜
请输入您猜测的数字范围(1-100):63
恭喜您猜对了,您一共猜了6次
 
 

4.4.数字累加脚本(1-100) 

需求:编写脚本实现计算从1加到100的值

①累加需要用到循环,已知循环次数时使用for循环

②也可以使用while循环达到累加条件时结束循环

vim m.sh                     #创建m.sh脚本
脚本内容:
sum=0                        #定义变量sum初始值为0
for i in {1..100}            #for循环 i取值从1到100
do 
sum=$[ i+sum ]               #每次循环内容计算变量i+sum的值赋值给sum
done                         #for语句结束标志
echo "1-100累加值为:$sum"    #循环结束后输出内容


bash  m.sh                   #调用shell执行脚本
执行结果:
"1-100累加值为:5050"

 

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

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

相关文章

springboot之多数据源配置

文章目录 一、多数据源的典型使用场景1 业务复杂&#xff08;数据量大&#xff09;2 读写分离 二、如何实现多数据源通过AbstractRoutingDataSource动态指定数据源多数据源切换方式AOPMyBatis插件 三、spring集成多个Mybatis框架 实现多数据源控制四、dynamic-datasource 多数据…

YOLO目标检测算法训练过程学习记录

先前已经完成过YOLO系列目标检测算法的调试过程&#xff0c;今天主要是将所有的调试加以总结 这里的conda环境就不再赘述了&#xff0c;直接使用requirement.txt文件的即可&#xff0c;也可以参考YOLOX的配置过程5 数据集处理 YOLOv5有自己的数据集格式&#xff0c;博主的数据…

70 # 协商缓存的配置:通过修改时间

对比&#xff08;协商&#xff09;缓存 比较一下再去决定是用缓存还是重新获取数据&#xff0c;这样会减少网络请求&#xff0c;提高性能。 对比缓存的工作原理 客户端第一次请求服务器的时候&#xff0c;服务器会把数据进行缓存&#xff0c;同时会生成一个缓存标识符&#…

iOS_Crash报告的组成结构

崩溃报告结构如下&#xff0c;每个部分都包含可帮助定位崩溃位置的信息&#xff1a; 1. Header 描述崩溃发生的环境&#xff0c;包含设备、系统、时间、版本等信息。如&#xff1a; Incident Identifier: 6156848E-344E-4D9E-84E0-87AFD0D0AE7B CrashReporter Key: 76f2fb…

【C++STL基础入门】深入浅出string类insert和appand

文章目录 前言一、插入1.中间插入2.尾巴插入拼接appand 总结 前言 本系列STL是使用vs2022C20版本特性来写的。 在C标准模板库&#xff08;STL&#xff09;的众多容器中&#xff0c;string类是处理字符串的重要工具。它提供了丰富的函数和操作符&#xff0c;使得字符串的操作…

真机二阶段之堆叠技术

堆叠技术 --- 可以将多台真实的物理设备逻辑上抽象成一台 思科 -- VPC 华为 -- iStack和CSS 华三 -- IRF 锐捷 -- VSU iStack和CSS的区别&#xff1a; CSS --- 集群 --- 它仅支持将两台支持集群的交换机逻辑上整合成一台设备。 iStack --- 堆叠 --- 可以将多台支持堆叠的交换…

Agile Iteration Velocity

【agile iteration velocity】敏捷速度指的平均速度 第四次迭代结束速度&#xff1a; 76 / 4 19 第五次迭代结束速度&#xff1a; &#xff08;76 24 &#xff09; / 5 100 / 5 20

【地理专题】2023年最新全国A级景区数

数据来源&#xff1a;中国文化和旅游部时间跨度&#xff1a;2023年区域范围&#xff1a;全国范围数据字段&#xff1a; 景区名称&#xff1b;地址&#xff1b;等级&#xff1b;城市&#xff1b;经度&#xff1b;纬度 该图基于自然资源部地图技术审查中心标准地图服务网站下载…

The internal rate of return (IRR)

内部收益率 NPV(Net Present Value)_spencer_tseng的博客-CSDN博客

华为网络篇 OSPF的Silent-Interface-33

难度1复杂度1 目录 一、实验拓扑 二、实验步骤 三、实验过程 总结 一、实验拓扑 二、实验步骤 1.搭建如图所示的网络拓扑&#xff1b; 2.初始化各设备&#xff0c;配置相应的IP地址&#xff0c;测试直连网络的连通性&#xff1b; 3.整个网络配置OSPF协议&#xff0c;查看…

使用预制体画刷在游戏场景中快速布置预制体、粒子特效等

有时候在使用tilemap的时候&#xff0c;会希望在场景中添加更复杂的对象。 在2d-extras中&#xff0c;加入了预制件笔刷&#xff08;Prefab Brush&#xff09;&#xff0c;可以将游戏物体预制体作为瓦片&#xff0c;来方便的在游戏场景中快速的绘制。可以自动适应游戏物体的位置…

Docker容器:docker镜像的创建及dockerfile

Docker容器&#xff1a;docker镜像的创建及dockerfile案例 一.docker镜像的三种创建方法 创建镜像有三种方法&#xff1a;基于现有镜像创建、基于本地模板创建及基于dockerfile创建 1.基于现有镜像创建 1.1 启动镜像 #首先启动一个镜像&#xff0c;在容器里做修改 docker …

Linux笔试题(1)

1、以长格式列目录时&#xff0c;若文件test的权限描述为&#xff1a;drwxrw-r–&#xff0c;则文件test的类型及文件主的权限是__A____。 A.目录文件、读写执行 B.目录文件、读写 C.普通文件、读写 D.普通文件、读 在这个问题中&#xff0c;我们需要解析文件权限的描述&…

Java面向对象三大特性之多态及综合练习

1.1 多态的形式 多态是继封装、继承之后&#xff0c;面向对象的第三大特性。 多态是出现在继承或者实现关系中的。 多态体现的格式&#xff1a; 父类类型 变量名 new 子类/实现类构造器; 变量名.方法名(); 多态的前提&#xff1a;有继承关系&#xff0c;子类对象是可以赋…

Android11 中 LED 使用-RK3568

文章目录 前言原理图设备树驱动前言 现在我们来学习点亮LED 原理图 然后对应在核心板原理图上查找 Working_LEDEN_H_GPIO0_B7,如下图所示: 那么我们只要控制 GPIO0_B7 即可控制 led 的亮灭。 设备树 leds: leds {compatible = "gpio-leds";work_led: work {gpi…

AgentBench——AI智能体基准测试官方

ModaGPT 简介 排行榜 提交模型 提问 AgentBench是第一个系统性的基准测试,用于评估LLM作为智能体在各种真实世界挑战和8个不同环境中的表现。 Models

shell脚本——文件三剑客之grep

一.grep选项 -A<显示行数>&#xff1a;除了显示符合样式的那一列之外&#xff0c;并显示该行之后的内容&#xff0c;下几行内容&#xff0c;本行也会显示 -B<显示行数>&#xff1a;除了显示符合样式的那一行之外&#xff0c;并显示该行之前的内容&#xff0c;上几行…

回归预测 | MATLAB实现SA-BP模拟退火算法优化BP神经网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SA-BP模拟退火算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现SA-BP模拟退火算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介…

【脚踢数据结构】常见树总结(图码结和版)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的…

UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.5->2.3

目录 之前的文章&#xff1a; 1.5 Blend Attributes by Value 发射器更新 粒子生成 粒子更新 2.1 Static Beams ​编辑 发射器更新&#xff1a; 粒子生成 粒子更新 2.2 Dynamic Beams 没有开始模拟前的效果是&#xff1a; 开始模拟后的效果是&#xff1a; 发射器更新 …