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://xiahunao.cn/news/2870225.html

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

相关文章

更改el-tabs默认样式,实现tab标签居中显示,标签对应内容使用另一个div显示

首先看效果图 如图所示&#xff0c;标签在浏览器窗口居中&#xff0c;但是下面的内容依然是默认从左到右&#xff0c;不会受到tab样式的影响 <template><div><div style"display: flex; justify-content: center; align-items: center;"><el-…

操作系统镜像文件(win,centos)

下载镜像 下载地址 MSDN, 我告诉你 - 做一个安静的工具站 如果想要在vm中全屏的建议下载待spl的镜像文件&#xff0c;不然会搞不起来全屏 找到自己写想要的镜像文件&#xff0c;这边我选了win7 复制圈起来的路径&#xff0c;到迅雷中新建下载即可 安装window可能需要密钥 …

<爬虫部署,进阶Docker>----第三章 Docker的版本命令

前言: 继续上一篇https://hsnd-91.blog.csdn.net/article/details/136752296 我们继续往Docker上挖掘! 正文: 1.docker version 我已经把每个Docker version下的命令翻译成了中文,大家参照一下: - Cloud integration: v1.0.35desktop.11: 这是Docker客户端与云集成的版本信…

数据结构的基本框架以及泛型

目录 集合框架复杂度大O的渐进表示法 装包(箱)或者拆包(箱)装包拆包 泛型泛型的上界泛型方法求最大值 集合框架 Java的集合框架,Java Collection Framework 又被称为容器container, 定义在java.util包下的一组 interfaces 和其实现类 classes interface: 接口 abstracb class…

前端框架的发展史介绍框架特点

目录 1.前端框架的发展历程 2.官网、优缺点、使用场景 2.1 jQuery 2.2 AngularJS 2.3 React 2.4 Vue.js 2.5 Angular 1.前端框架的发展历程 jQuery&#xff08;2006年&#xff09;&#xff1a;jQuery是一个非常流行的JavaScript库&#xff0c;用于简化DOM操作和事件处理…

数据库系统原理实验报告2 | 创建数据库和表

整理自博主本科《数据库系统原理》专业课自己完成的实验报告&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 专业课本&#xff1a; ———— 本次实验使用到的图形化工具&#xff1a;Heidisql 目录 一、实验目的 二、实验内容 1、创建数据库 2、创建表 1.…

项目实践《招聘网站数据爬取》

文章目录 一、模块导入部分二、预定义参数部分三、函数定义部分&#xff1a;send_get(page)四、函数定义部分&#xff1a;process_data(data)五、函数定义部分&#xff1a;responsibility(job_url)六、函数定义部分&#xff1a;while_data()七、主程序执行部分&#xff1a;八、…

利用express从0到1搭建后端服务

目录 步骤一&#xff1a;安装开发工具步骤二&#xff1a;安装插件步骤三&#xff1a;安装nodejs步骤四&#xff1a;搭建启动入口文件步骤五&#xff1a;启动服务器总结 在日常工作中&#xff0c;有很多重复和繁琐的事务是可以利用软件进行提效的。但每个行业又有自己的特点&…

【消息队列开发】 实现MemoryDataCenter类——管理内存数据

文章目录 &#x1f343;前言&#x1f334;数据格式的准备&#x1f332;内存操作&#x1f6a9;对于交换机&#x1f6a9;对于队列&#x1f6a9;对于绑定&#x1f6a9;对于单个消息&#x1f6a9;对于队列与消息链表&#x1f6a9;对于未确认消息&#x1f6a9;从硬盘上读取数据 ⭕总…

Java -- 异常

异常概念 异常是程序在运行期间发生的不正常的事件, 它会打断指令的正常执行流程.   设计良好的程序应该在异常发生时提供处理这些不正常事件的方法, 使程序不会因为异常的发生而阻断或产生不可预见的结果.    Java语言使用异常处理机制为程序提供了异常处理的能力. 异常分…

无线局域网——wlan

目录 一.wlan的含义和发展 二.wlan技术带来的挑战 1.企业办公场景多样 2.位置速度的要求 3.安全的要求 4.规范的挑战 三.家庭和企业不同的部署需求 1.胖AP模式组网 2.AC瘦AP模式组网 3.组网模式的不同 四.三层隧道转发实验 1.拓扑 2.AP上线 核心交换机vlan ​编辑…

LGB2028 反向输出一个三位数

&#xff08;LG是洛谷&#xff08;洛谷&#xff09;的意思&#xff09; 题目链接&#xff1a;B2028 题目描述 将一个三位数反向输出&#xff0c;例如输入 358&#xff0c;反向输出 853。 输入格式 一个三位数 n。 输出格式 反向输出 n。 输入输出样例 输入 #1 100 输…

HashMap底层是如何实现的?

1、典型回答 不同的JDK 版本&#xff0c;HashMap 的底层实现是不一样的&#xff0c;总体来说&#xff1a;在JDK 1.8 之前(不包含JDK 1.8)&#xff0c;HashMap 使用的是数组 链表实现的&#xff0c;而JDK 1.8之后(包含JDK 1.8)使用的是数组 链表或红黑树实现的 HashMap 在JD…

CTFHUB-web-信息泄漏

题目所在位置&#xff1a;技能树->web->信息泄漏 目录遍历 打开题目&#xff0c;我们进入的是这个页面 翻译过来就是 得到的信息就是&#xff1a;flag要在这些目录里面寻找&#xff0c;我们直接一个一个点开查看就行 发现得到一个flag.txt&#xff0c;点击打开得到flag …

计算机组成原理 第五章(计算机的运算方法)—第六节(算数逻辑单元)

写在前面&#xff1a; 本系列笔记主要以《计算机组成原理&#xff08;唐朔飞&#xff09;》为参考&#xff0c;大部分内容出于此书&#xff0c;笔者的工作主要是挑其重点展示&#xff0c;另外配合下方视频链接的教程展开思路&#xff0c;在笔记中一些比较难懂的地方加以自己的…

upload-labs通关方式

pass-1 通过弹窗可推断此关卡的语言大概率为js&#xff0c;因此得出两种解决办法 方法一 浏览器禁用js 关闭后就逃出了js的验证就可以正常php文件 上传成功后打开图片链接根据你写的一句话木马执行它&#xff0c;我这里采用phpinfo&#xff08;&#xff09; 方法二 在控制台…

第八阶段:uni-app小程序 --首页开发(2)

一&#xff1a;分析页面布局 1.1: 功能 搜索框&#xff1a; 轮播图&#xff1a; 分类的导航区&#xff1a; 楼层区&#xff1a; 二&#xff1a; 利用命令创建home分支 git branch git checkout -b home git branch 三&#xff1a; 配置网络请求(main.js 入口函数&#x…

TCP多线程模型、IO模型(select、poll、epoll)

我要成为嵌入式高手之3月11日Linux高编第十九天&#xff01;&#xff01; ———————————————————————————— TCP并发模型 一、TCP多线程模型&#xff1a; 缺点&#xff1a;创建线程会带来资源开销&#xff0c;能够现的并发量比较有限 二、IO模型&…

科研绘图二:箱线图(抖动散点)

R语言绘图系列—箱线图抖动散点 &#xff08;二&#xff09;: 科研绘图一&#xff1a;箱线图&#xff08;抖动散点&#xff09; 文章目录 R语言绘图系列---箱线图抖动散点&#xff08;二&#xff09;: 科研绘图一&#xff1a;箱线图&#xff08;抖动散点&#xff09; 前言一、…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Web)下篇

onRequestSelected onRequestSelected(callback: () > void) 当Web组件获得焦点时触发该回调。 示例&#xff1a; // xxx.ets import web_webview from ohos.web.webviewEntry Component struct WebComponent {controller: web_webview.WebviewController new web_webv…