Linux之shell循环

华子目录

  • for循环
    • 带列表的for循环
      • 格式
      • 分析
      • 示例
      • shell允许用户指定for语句的步长,格式如下
      • 示例
    • 不带列表的for循环
      • 示例
    • 基于C语言风格的for循环
      • 格式
      • 示例
      • 注意
  • while循环
    • 格式
    • 示例
  • until循环
    • 作用
    • 格式
    • 示例
  • 循环控制
    • break
    • continue
    • 详细语法
    • 示例
  • 循环嵌套
    • 示例

for循环

  • for循环是最简单,也是最常用的循环语句。与其他的程序设计语言一样,for循环都是初学者在学习循环结构时的入门课程。for循环通常用于遍历整个对象或者数字列表。按照循环条件的不同,for循环语句可以分为带列表的for循环、不带列表的for循环以及类C风格的for循环。本节将介绍这3种不同的for循环结构。

带列表的for循环

格式

for 循环变量 in {list} 
dostatement1statement2...
done

分析

  • variable称为循环变量
  • list是一个列表,可以是一系列的数字或者字符串,元素之间使用空格隔开
  • do和done之间的所有的语句称为循环体,即循环结构中重复执行的语句
  • 执行时,Shell会将in关键字后面的list列表的第1个元素的值赋给变量variable,然后执行循环体,当循环体中的语句执行完毕之后剩余以此类推,当list列表中的所有的元素都被访问后,for循环结构终止,程序将继续执行done语句后面的其他的语句

示例

[root@server ~]# vim  for1.sh
#!/bin/bash
for ip in 192.168.80.129 192.168.80.130
doecho $ip
done[root@server ~]# bash for1.sh 
192.168.80.129
192.168.80.130
[root@server ~]# vim  for2.sh
#!/bin/bash
for ip in 192.168.80.{120..140..1} # 使用{start..end..step} 进行扩展
doecho  $ip
done[root@server ~]# bash for2.sh
192.168.80.120
192.168.80.121
192.168.80.122
192.168.80.123
192.168.80.124
192.168.80.125
192.168.80.126
192.168.80.127
192.168.80.128
192.168.80.129
192.168.80.130
192.168.80.131
192.168.80.132
192.168.80.133
192.168.80.134
192.168.80.135
192.168.80.136
192.168.80.137
192.168.80.138
192.168.80.139
192.168.80.140
  • 获取指定目录下的所有目录的文件名
[root@server ~]# vim for3.sh
#!/bin/bash
for file  in $(ls -F / | grep  "/$")
doecho  $file | cut  -d  "/" -f1
done# ls -F  :用于将目录内的文件按照文件类型进行归类显示,会在不同类别的文件名尾部增加不同的标识符,目录以/结尾、链接文件以@结尾、可执行文件以*结尾、普通文件无符号
# grep "/$" :表示过滤以/结尾的行[root@server ~]# bash for3.sh
afs
boot
dev
etc
home
media
mnt
opt
proc
root
run
srv
sys
tmp
usr
var

shell允许用户指定for语句的步长,格式如下

for variable in {start..end..step}
dostatement1statement2...
done

示例

  • 例3:计算1+2+3+4+5+……+100和
[root@server ~]# bash for4.sh
#!/bin/bash
sum=0
for i in {1..100..1}
do((sum=$sum+$i))
done
echo "sum=$sum"[root@server ~]# bash for4.sh
sum=5050
# 上例修改
[root@server ~]# bash for4.sh
#!/bin/bash
sum=0
for i in $(seq 100)
do((sum=$sum+$i))
done
echo "sum=$sum"[root@server ~]# bash for4.sh
sum=5050

不带列表的for循环

  • 原则:for不提供循环列表,shell将从命令行(相当于以位置参数的形式传入循环列表)获取循环列表数据及条件,格式:
for variable
dostatement1statement2...
done
  • 由于系统变量$@可以获取所有位置参数,以上的语法等价于:
for variable in $@$*
dostatement1statement2...
done

示例

[root@server ~]# vim for5.sh
#!/bin/bash
for  arg
do      echo  $arg
done    [root@server ~]# bash for5.sh {1..10..2}
1
3
5
7
9

基于C语言风格的for循环

格式

for ((初始化;条件表达式;步长))    # 注意:2个圆括号
dostatement1statement2...
done

示例

  • 面试题,批量创建账户
[root@server ~]# vim for6.sh
#!/bin/bash
for((i=1;i<=10;i++))
doif ! id -u temp$i &> /dev/nullthenuseradd temp$iecho "123456" | passwd --stdin temp$i &> /dev/nullelseecho "temp$i 账户已存在"fi
done                 [root@server ~]# bash for6.sh
[root@server ~]# id temp1
用户id=1001(temp1) 组id=1001(temp1)=1001(temp1)

注意

i++表示置后自增,++i置前自增

[root@server ~]# x=1
[root@server ~]# y=2
[root@server ~]# echo  $((x++))
1
[root@server ~]# echo $x
2
[root@server ~]# echo  $((++y))
3
[root@server ~]# echo $y
3

while循环

格式

while  expression
dostatement1statement1……
done
  • 上例语法中,expression表示条件表达式,循环必须满足该表达式,否则循环结束,可以是任何符合语法的shell命令,但推荐书写测试表达式

示例

  • while循环读取文件
# 法1 ,采用exec读取文件
[root@server ~]# vim  file1.txt
data1
data2
data3
data4
data5
[root@server ~]# vim  while1.sh
#!/bin/bash
exec  < file1.txt
while  read   a
doecho $a
done
# exec  < file1.txt  将file.txt文件内容读入到标准输入中
# read   a  表示从标准输入中按照行读取内容到变量a[root@server ~]# bash while1.sh
data1
data2
data3
data4
data5
# 法2:使用cat读取文件,通过管道符进入while循环处理
cat  文件名  |  while  read line
do  statement1statement1……
done
#法3 : 在while循环尾部使用输入重定向指定输入数据
while  read  line
dostatement1statement1……
done  <  文件名
  • 猜商品价格,通过变量RANDOM获取随机整数并控制20以内,提示用户猜测商品价格猜测时需要记录次数猜中后退出程序
[root@server ~]# vim  while2.sh
#!/bin/bash
price=$[ $RANDOM%20 ]
count=0
while true
doread -p "请输入[0-20]间的商品价格: "  INTlet count++if(($INT==$price))thenecho  "恭喜,你猜中!"echo  "你使用了$count次机会"exit  0elif (($INT>$price))thenecho  "你输入的商品价格高了!"elseecho  "你输入的商品价格低了!"fi
done[root@server ~]# bash while2.sh
请输入[0-20]间的商品价格:10
你输入的商品价格高了
请输入[0-20]间的商品价格:5
你输入的商品价格高了
请输入[0-20]间的商品价格:3
你输入的商品价格高了
请输入[0-20]间的商品价格:2
你输入的商品价格高了
请输入[0-20]间的商品价格:1
你输入的商品价格高了
请输入[0-20]间的商品价格:0
恭喜,你猜中了
你使用了6次机会

until循环

作用

  • until循环不断地重复执行循环中的语句,直至某个条件成立,与while循环的执行条件相反

格式

until  expreession
dostatement1statement2……
done

示例

[root@server ~]# vim  while3.sh
# while3.sh 的改写
#!/bin/bash
i=1
until [  $i -gt 10 ]  # i>10 ,注意,条件要相反
doif id -u temp$i &> /dev/nullthenuserdel  -r test$ielseecho "test$i 账户已删除"filet i++
done

循环控制

break

break: 是立即跳出某个循环结构。break语句可以用在for、while或者until等循环语句的循环体中

continue

continue: 作用不是退出循环体。而是跳过当前循环体中该语句后面的语句,重新从循环语句开始的位置执行

详细语法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

示例

  • 判断素数
[root@server ~]# vim  for7.sh
#!/bin/bash
read  -p  "请输入一个正整数: " prime
if ((prime<2))
thenecho "数据错误,请输入大于等于2的正整数!"
else    for ((i=2;i<prime;i++))do      if ((prime%i==0))then    echo  "平数"breakfi      done   if ((i==prime))then    echo "素数"fi      
fi      
  • 计算100到150之间不能被3整除的数,输出时一行显示5个
[root@server ~]# bash  for8.sh
#!/bin/bash
count=0
for((i=100;i<150;i++))
doif ((i%3==0))thencontinuefiecho -ne "$i\t"((count++))if ((count%5==0))thenechofi
done
echo

循环嵌套

示例

  • 九九乘法表
[root@server ~]# bash  for9.sh
#!/bin/bash
for i in $(seq 9)
dofor j in $(seq 9)do((j<=i)) &&  echo  -ne "$i*$j=`echo $((i*j))` \t"doneecho
done
  • 打印三角形
[root@server ~]# bash  for10.sh
#!/bin/bash
read  -p  "请输入图形行数:"  h   
for ((i=0;i<h;i++))         # 循环处理h行
dofor ((j=0;j<h-i;j++))  # 每行打印一些空格doecho  -n " "donefor ((k=0;k<2*i+1;k++))  # 每行打印一些星号doecho  -n  "*"doneecho                     # 每行最后打印一个\n
done
  • 打印数字三角形
[root@server ~]# bash  for11.sh
#!/bin/bash
for ((i=1;i<10;i++))
dofor ((j=1;j<=10-i;j++))doecho  -n  " "donefor ((k=1;k<=i;k++))doecho  -n  "$i"doneecho
done

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

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

相关文章

深度学习——SAM(Segment-Anything)代码详解

目录 引言代码目录segment-anything 代码详解build_sam.pypredictor.pyautomatic_mask_generator.py 引言 从去年年初至今&#xff0c;SAM(Segment Anything )已经问世快一年了&#xff0c;SAM凭借其强大而突出的泛化性能在各项任务上取得了优异的表现&#xff0c;广大的研究者…

源码编译部署LAMP

编译部署LAMP 配置apache [rootzyq ~]#: wget https://downloads.apache.org/apr/apr-1.7.4.tar.gz --2023-12-11 14:35:57-- https://downloads.apache.org/apr/apr-1.7.4.tar.gz Resolving downloads.apache.org (downloads.apache.org)... 88.99.95.219, 135.181.214.104…

BUUCTF-WEB1

[ACTF2020 新生赛]Exec1 1.打开靶机 是一个ping命令 2.利用管道符“|” ping一下本地主机并查看ls ping 127.0.0.1 | ls 可以看到回显的内容是一个文件 127.0.0.1 | cat index.php #查看主机下index.php 127.0.0.1 | ls / #查看主机根目录下的文件 看的一个flag文件 …

数据仓库数据分层详解

数据仓库中的数据分层是一种重要的数据组织方式&#xff0c;其目的是为了在管理数据时能够对数据有一个更加清晰的掌控。以下是数据仓库中的数据分层详解&#xff1a; 原始数据层&#xff08;Raw Data Layer&#xff09;&#xff1a;这是数仓中最底层的层级&#xff0c;用于存…

jupyter闪退和自动跳转问题

1.闪退问题 当我们点击jupyter时&#xff0c;它会闪一下&#xff0c;然后无法进入&#xff0c;这个时候我们可以去prompt命令行输入jupyter notebook启动试试&#xff0c;如果还不行&#xff0c;我们可以根据报错去解决&#xff0c;一般csdn上都有对应情况&#xff0c;直接搜索…

Linux-新手小白速秒Hadoop集群全生态搭建(图文混编超详细)

在之前的文章中&#xff0c;我教会大家如何一步一步搭建一个Hadoop集群&#xff0c;但是只提供了代码&#xff0c;怕有些朋友会在一些地方产生疑惑&#xff0c;今天我来以图文混排的方式&#xff0c;一站式交给大家如何搭建一个Hadoop高可用集群包括&#xff08;HadoopHA&#…

el-select使用filterable下拉无法关闭得问题

这里推荐一个前端框架 sakuya / SCUI&#xff0c;他里面有个formTable&#xff0c;可以解决很多订单明细保存得问题。基本沿用element-plus的前端使用模式&#xff0c;让表单表格变的非常容易。 这个的供应商插件&#xff0c;当使用filterable后&#xff0c;点击表格重的选项&…

Redis Desktop Manager:一站式Redis数据库管理与优化

Redis Desktop Manager是一款功能强大的Redis桌面管理工具&#xff0c;也被称作Redis可视化工具。以下是其主要的功能特色&#xff1a; 连接管理&#xff1a;Redis Desktop Manager支持连接多个Redis服务器&#xff0c;用户可以在同一界面下管理多个数据库&#xff0c;大大提高…

记录一下在Pycharm中虚拟环境的创建

如果在Pycharm中要新建一个虚拟环境&#xff0c;那你可以在Terminal中选择Command Prompt&#xff0c;在这里面执行相关命令 一、安装了Anaconda&#xff0c;创建虚拟环境 当你使用解释器是Anaconda提供的时&#xff0c;你可以使用conda命令执行&#xff0c;见以下操作&#x…

前端Vue与uni-app中的九宫格、十二宫格和十五宫格菜单组件实现

在前端 Vue 开发中&#xff0c;我们经常会遇到需要开发九宫格、十二宫格和十五宫格菜单按钮的需求。这些菜单按钮通常用于展示不同的内容或功能&#xff0c;提供给用户快速访问和选择。 一、引言 在前端开发中&#xff0c;九宫格、十二宫格和十五宫格菜单按钮是一种常见的布局…

202206 CSP认证 | 角色授权

角色授权 fine&#xff0c;又是一道acwing上TLE但是平台通过了的&#xff0c;那就酱吧… 直接跟着题目来模拟的…先找到每个用户授予的所有角色&#xff0c;包括用户本身和它所属的用户组。 然后遍历这个角色集合&#xff0c;看是否有操作权限&#xff0c;种类权限以及资源名称…

SVN修改已提交版本的注释

目录 一、需求分析 二、问题分析 三、解决办法 一、需求分析 ​开发过程中&#xff0c;在SVN提交文件后&#xff0c;发现注释写的不完整或不够明确&#xff0c;想再修改之前的注释文字​。 使用环境&#xff1a; SVN服务器操作系统&#xff1a;Ubuntu 20.04.6 LTS SVN版本&…

JVM实战篇

内存调优 内存溢出和内存泄漏 内存泄漏&#xff1a;在java中如果不再使用一个对象&#xff0c;但是该对象依然在GC ROOT的引用链上&#xff0c;这个对象就不会被垃圾回收器回收。 内存泄漏绝大多数情况都是由堆内存泄漏引起的&#xff0c;所以后续没有特别说明则讨论的都是堆…

Linux-centos如何搭建yum源仓库

1.本地搭建&#xff08;无需连接外网&#xff09; 1.1检查网络配置&#xff0c;及网络连接 打开虚拟机&#xff0c;点击【编辑——虚拟网络编辑器】 点击【仅主机模式】查看子网段是否和局内IP匹配 进入局内&#xff0c;查看网络IP是否在你上述设置的网段内&#xff0c;如果不…

Chapter 13 Techniques of Design-Oriented Analysis: The Feedback Theorem

Chapter 13 Techniques of Design-Oriented Analysis: The Feedback Theorem 从这一章开始讲负反馈Control系统和小信号建模. 13.2 The Feedback Theorem 首先介绍 Middlebrook’s Feedback Theorem 考虑下面负反馈系统 传输函数 Guo/ui G ( s ) u o u i G ∞ T 1 T G…

1.实用Qt:解决绘制圆角边框时,圆角锯齿问题

目录 问题描述 解决方案 方案1&#xff1a; 方案2&#xff1a; 结果示意图 问题描述 做UI的时候&#xff0c;我们很多时候需要给绘制一个圆角边框&#xff0c;初识Qt绘制的童鞋&#xff0c;可能绘制出来的圆角边框很是锯齿&#xff0c;而且粗细不均匀&#xff0c;如下图&…

Vue | 使用 ECharts 绘制折线图

目录 一、安装和引入 ECharts 二、使用 ECharts 2.1 新增 div 盒子 2.2 编写画图函数 2.3 完整代码结构 三、各种小问题 3.1 函数调用问题 3.2 数据格式问题 3.3 坐标轴标签问题 3.4 间隔显示标签 参考博客&#xff1a;Vue —— ECharts实现折线图 本文是在上…

JVM学习-JVM简介以及其内部结构

目录 1.什么是JVM 2.JVM、JRE、JDK、JavaSE、JavaEE之间的联系 3.JVM的内部结构 4.各部分的作用 4.1 类加载器 4.2 方法区 4.3 堆 ​编辑 4.4 虚拟机栈 4.5 程序计数器 4.6 本地方法栈 4.7 解释器和JIT即时编译器 4.9 GC垃圾回收 5.拓展 5.1一些可能会遇到的问…

opencv安装(C++)并配置vs

准备工作&#xff1a; 1.opencv安装包(此教程使用4.9) 2.visual studio(此教程使用vs2019) opencv安装&#xff1a; 1、下载opencv&#xff1a; 1.1 官网下载&#xff1a;Releases - OpenCV 1.2 百度网盘&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1NpEoFjbbyQJtFD…

CTF-希尔加解密

对于希尔加解密很多writeup都说用在线工具&#xff0c;所以研究了一下&#xff0c;写了一个方便的加解密python代码&#xff0c;根据给定的字母表及私钥字符串&#xff0c;尝试不同纬度不同重叠的加密矩阵输出加解密结果。运行效果如下&#xff1a; 代码文件Hill希尔加解密_fi…