[Linux] shell脚本之循环

一、循环定义

一组被重复执行的语句称之为 循环体,能否继续重复,决定循环的终止条件。 循环语句 是由循环体及循环的终止条件两部分组成的。

二、for循环

2.1 带列表循环

语法
for 变量名 in 取值列表do  命令序列  done

花括号用法:

花括号{ }和seq在for循环的应用:
for i in {1..10..2} 1-10的奇数
for i in {0..10..2} 1-10的偶数
for i in {10..1}  1-10倒序排列

for i in $(seq 10)  1-10正序排列
for i in $(seq 10 -1 1) 1-10倒序排列
for i in $(seq 1 2 10) 1-10的奇数,中间为步长

 运用演示1:列表打印

   需求:打印一份一到十的数字列表

#!/bin/bashfor i in {1..10}
do
echo $i
done

运用演示二:分类打印

需求:打印一份 0-10以内的奇数列表

for i in {1..10..2}
do
echo $i
done

脚本
#!/bin/bash
for i in {1..10..2}
do
echo $i
done

 

 需求二:打印一份0-10以内的偶数列表

for i in {0..10..2}
> do
> echo $i
> done

用脚本写
#!/bin/bash
for i in {0..10..2}
do
echo $i
done

 

运用演示三:累加求和 

需求:求从1加到10的和 

sum=0
for i in {1..10}
> do
> sum=$[sum+i]
> done
echo $sum
55

脚本求1加到100的和
#!/bin/bash
i=0
sum=0
for i in {1..100}
do
sum=$[sum +i]
let i++
done
echo $sum

 

 2.2 不带列表循环

语法
for 变量名 
do
命令
done

 运用演示:打印hello

#!/bin/bash
for i
do
echo hello
done

注意:脚本需要执行权限,i也要赋予一个值 

2.3 类似c语言格式的循环

语法
for ((表达式1;表达式2;表达式3))
do
命令
done
表达式1:定义变量并赋值表达式2:决定是否循环表达式3:决定循环变量如何改变,决定循环什么时候结束

配合命令let使用

++	自身变量+1
--  自身变量-1
+=5	自身变量+5
-=5	自身变量-5
*=5	自身变量*5
/=5	自身变量/5
%=5	自身变量%5

运用演示:从1+到100

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

三、while 循环

3.1 while 语法结构

语法
while   [ 判断条件] 使用while循环满足条件执行do,不满足不执行 do       执行动作   while循环执行动作done         while循环结束标志

应用演示:求和

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

3.2 死循环语句

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

    do       一直执行do内的命令

    done

2.while  true        直接写判断条件为真

    do       一直执行do内的命令

    done

3.while :         判断条件为冒号也表示死循环

    do       一直执行do内的命令 

    done

四、双重循环及跳出循环

4.1 双重循环的机制

单层循环:执行命令从上至下依次执行命令,进行条件判断,如果没有达到退出循环的要求,

便再次进行该操作

双重循环:循环中嵌套循环(在这里我们将外面的循环称作外部循环,嵌套在里面的叫内部循环)

当外部循环执行一次时,内部循环就要将自身的所有循环进行一遍,一整个双重循环结束后,内部循环执行的次数等于自己本身循环的所有次数乘以外部循环的所有循环次数

运用演示:

#!/bin/bash#这是一个双重循环的测试实验for ((i=1;i<=5;i++))
doecho "=============这是外部循环执行的第 $i 次==================== "for  ((j=1;a<=5;j++))doecho  "这是内部循环执行的第 $j 次" done
done

打印九九乘法表

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

4.2 跳出循环

        break跳出单个循环 break n 数字数字是几代表跳出n层循环

        continue终止某次循环中的命令,但是不会完全终止命令

        exit 直接退出脚本

4.2.1 continue跳出循环 

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

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

4.2.2 break跳出循环

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

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

举例:
vim   a.sh     #创建a.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循环语句执行每循环一次输出$idone                 #第二层for循环语句结束标志                
done                     #第一层for循环语句结束标志
bash a.sh                #调用bash执行a.sh脚本
执行结果:第二层执行在$i=3是结束了循环,所以只能输出1和2,第一层for循环是循环3次,所以输出了3次。
1
2
1
2
1
2

4.2.3 exit跳出脚本
#!/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结束循环exit               第二层for循环判断语句执行命令,exit结束循环fi               #if语句结束echo "$i"            #第二层for循环语句执行每循环一次输出$idone                 #第二层for循环语句结束标志                
done                     #第一层for循环语句结束标志

 五、until循环

until循环与for,while循环不同的是,until循环是只要条件不符合就会一直循环,直到条件符合后才会退出循环

语句格式:until 条件测试操作  do    命令序列  done 

运用演示:求和

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

总结:

1. 掌握好三种循环的用法(特别是until和前两种循环对于条件判断是相反的) 

2.for循环读取文件时,如果遇到未按照默认分隔符隔开的文件,可以通过修改分隔符来实现正常读取(但是先备份分隔符的默认值,再进行修改,最后进行还原)

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

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

相关文章

【React-Router】导航传参

1. searchParams 传参 // /page/Login/index.js import { Link, useNavigate } from react-router-dom const Login () > {const navigate useNavigate()return <div>登录页<button onClick{() > navigate(/article?id91&namejk)}>searchParams 传参…

11.6AOP

一.AOP是什么 是面向切面编程,是对某一类事情的集中处理. 二.解决的问题 三.AOP的组成 四.实现步骤 1.添加依赖(版本要对应): maven仓库链接 2.添加两个注解 3.定义切点 4.通知 5.环绕通知 五.excution表达式 六.AOP原理 1.建立在动态代理的基础上,对方法级别的拦截. 2. …

【钉钉】通过链接方式跳转到应用机器人聊天窗口

使用这个方式&#xff1a; dingtalk://dingtalkclient/action/jumprobot?dingtalkid可以通过机器人回调拿到chatbotUserId这个字段&#xff0c;这个就是dingtalkid。 示例&#xff1a;&#xff08;chatbotUserId是不规则字符串&#xff0c;链接拼上这个参数最好 urlencode一…

银行业务测试

1、商业银行四大类&#xff1a; 业务类系统、渠道类面试、MIS类系统、其他基础平台系统 2、银行系统开发流程&#xff08;UAT是行方&#xff09; 3、银行系统测试流程 4、对于不同的服务方式也不同&#xff0c;如:柜台、手机银行、网上银行&#xff0c;电话外呼&#xff0c;…

每日一练:“打家劫舍“(House Robber)问题 I

1. 问题 假设有一排房屋&#xff0c;每个房屋里都存放着一定数量的财宝。相邻的房屋装有相互连通的防盗系统&#xff0c;如果两个相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。   求解的问题是&#xff0c;小偷在不触发警报的情况下&#xff0c;一晚上最多能偷…

B站已经部分上线前台实名,如不同意实名,后期账号流量将收影响!

B站部分百万粉丝博主的主页显示账号运营人名字的政策是从10月31日开始的。当天&#xff0c;B站官方发布了《哔哩哔哩关于头部“自媒体”账号前台实名的公告》&#xff0c;表明了其前台实名制的实施计划。 B站部分上线前台实名的过程可以追溯到2021年。当时&#xff0c;中国政府…

【Python】学习Python面向对象编程的疑问

&#xff08;Java菜鸟来学Python了&#xff09; &#x1f914; 1. 静态方法与类方法什么区别&#xff1f; 实例方法只能被实例对象调用(Python3 中&#xff0c;如果类调用实例方法&#xff0c;需要显示的传self, 也就是实例对象自己)&#xff0c;静态方法(由staticmethod装饰…

13、深度学习之神经网络

深度学习是机器学习中重要的一个学科分支,它的特点就在于需要构建多层“深度”的神经网络。 人们在探索人工智能初期,就曾设想构建一个用数学方式来表达的模型,它可以模拟人的大脑,大脑我们都知道,有很多神经元,每个神经元之间通过突触链接。 神经网络的设计就是模仿了这…

CRM系统中的联系人是什么?如何进行联系人管理?

上手CRM系统前掌握专业术语是必要的功课&#xff0c;在第一次使用CRM系统时小编和大家一样&#xff0c;分不清楚线索、联系人、客户、商机之间的关系&#xff0c;今天我们就来着重分享一下CRM中联系人是什么&#xff1f;如何进行联系人管理&#xff1f; CRM系统联系人是指能够…

物联网AI MicroPython学习之语法 WDT看门狗外设

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; WDT 介绍 模块功能: 看门狗WDT&#xff08;WatchDog Timer&#xff09;外设驱动模块 接口说明 WDT - 构建WDT对象 函数原型&#xff1a;WDT(timeout)参数说明&#xff1a; 参数类型必选参数&#xff1f…

每日一练:质因数分解

1. 题目 从键盘输入一个整数&#xff0c;开始整数的质因数分解&#xff0c;最后打印出该整数的所有质因数。 2.解题思路 1&#xff09;初始化&#xff1a; 从最小的质数开始&#xff0c;将输入的整数不断除以质数&#xff0c;直到无法整除为止。   2&#xff09;循环&#x…

哈希表之开散列的实现

回顾与引出 我们在上一节用闭散列的开放定址法实现了哈希表。不难看出这种方法有明显的缺点&#xff1a;一旦发生哈希冲突&#xff0c;所有的冲突连在一起&#xff0c;容易产生数据“堆积”&#xff0c;即&#xff1a;不同 关键码占据了可利用的空位置&#xff0c;使得寻找某关…