流程循环控制语句

目录

for循环

带列表循环

不带列表循环

类C风格循环

while循环

语法

无限循环

使用示例

until循环

基本语法

示例

select循环

语法格式

嵌套循环

break和continue

break的使用

continue的使用


在shell 中循环有以下几种:

for 循环        

while 循环

until 循环
select 循环
break 和 continue

for循环

        在shell中,for循环有两种情况

带列表循环
不带列表循环

带列表循环

        语法:

for 循环变量 in 列表
do执行语句...
done

        在语法中,循环变量是每次循环时得到的列表的某一数据,当循环一次结束后,再获取另一个数,然后再执行 do 里面的语句,依此类推,直到列表中数据循环完结

        for 循环中的列表中的数据是以空格来进行分隔的

示例:

        直到列出列表的所有元素

代码示例:

[root@openEuler ~]# cat for1.sh
#!/bin/bashfor var in 192.168.72.130 192.168.72.131 192.168.72.132
doecho $var
done
[root@openEuler ~]# bash for1.sh
192.168.72.130
192.168.72.131
192.168.72.132

还可以修改如下:

[root@openEuler ~]# cat for1.sh 
#!/bin/bashfor var in 192.168.72.13{0..3}
doecho $var
done
[root@openEuler ~]# bash for1.sh
192.168.72.130
192.168.72.131
192.168.72.132
192.168.72.133

还可以使用 seq 命令来生成列表数据:

[root@openEuler ~]# cat for1.sh
#!/bin/bashfor var in $(seq -f "192.168.72.13%1g" 1 5)
doecho $var
done
[root@openEuler ~]# bash for1.sh 
192.168.72.131
192.168.72.132
192.168.72.133
192.168.72.134
192.168.72.135

         在带列表的 for 循环中,还可以指定循环的步长

语法:

for 循环变量 in {开始..结束..步长}
do语句....
done

示例:

        循环输入1~10中的奇数

[root@openEuler ~]# cat for2.sh 
#!/bin/bashfor v in {1..10..2}
doecho $v
done
[root@openEuler ~]# bash for2.sh 
1
3
5
7
9

示例:

        获取根目录下所有文件名作为变量的值打印输出

代码示例:

[root@openEuler ~]# cat for3.sh 
#!/bin/bashfor file in $(ls -F / | grep -v /$)
doecho $file
done[root@openEuler ~]# bash for3.sh 
bin@
lib@
lib64@
sbin@

示例:

        打印出如下的语句中字符数不大于6的单词

        hello world rabbit favorite eat apple cabbage

代码示例:

[root@openEuler ~]# cat for4.sh 
#!/bin/bashfor word in hello world rabbit favorite eat apple cabbage
doif [ `expr length ${word}` -le 6 ]; thenecho $wordfi
done
[root@openEuler ~]# bash for4.sh 
hello
world
rabbit
eat
apple

不带列表循环

语法:

for 循环变量
do语句...
done

示例:

        循环输入所有的参数

代码示例:

[root@openEuler ~]# cat for5.sh
#!/bin/bashfor v in $@
doecho $v
done
[root@openEuler ~]# bash for5.sh 
[root@openEuler ~]# bash for5.sh {1..5}
1
2
3
4
5

类C风格循环

语法:

for ((表达式1;表达式2;表达式3))
do语句
done

示例:

        批量创建用户,用户名以 test 开头,按数字序号变化,一共添加30个账号,名称如:test01、test02、test03、......、test10、......、test30,用户初始密码为:Abc123456

代码示例:

[root@openEuler ~]# cat for6.sh
#!/bin/bashfor ((i=1;i<=30;i++))
doif [ $i -lt 10 ]; thenuser=test0$ielseuser=test$ifiif ! id -u $user &> /dev/nullthenuseradd $userecho "Abc123456" | passwd --stdin $user &> /dev/nullelseecho "$user is exists"fi
done[root@openEuler ~]# bash for6.sh
[root@openEuler ~]# grep test /etc/passwd
test01:x:1001:1001::/home/test01:/bin/bash
test02:x:1002:1002::/home/test02:/bin/bash
test03:x:1003:1003::/home/test03:/bin/bash
test04:x:1004:1004::/home/test04:/bin/bash

方式二:

[root@openEuler ~]# cat for7.sh 
#!/bin/bashfor u in `seq -f "test%02g" 1 30`
doif ! id -u $u &>/dev/nulluseradd $uecho "Haha123123" | passwd --stdin $ufi
done

while循环

语法

while [ 条件表达式 ]
do语句语句
done

示例:

        循环输出1~10这几个数

代码示例:

[root@openEuler ~]# cat while1.sh 
#!/bin/bashi=1
while [ $i -le 10 ]
doecho $ilet i++
done

示例:

        使用exec读取指定文件的内容并循环输出,文件内容如下:

[root@openEuler ~]# cat myfile
open
openlab
openlab123
linux
readhat

代码示例:

        

# 第一步创建文件及内容
[root@openEuler ~]# cat > myfile << EOF
> open
> openlab
> openlab123
> linux
> readhat
> EOF
[root@openEuler ~]# cat myfile 
open
openlab
openlab123
linux
readhat
# 第二步:编写脚本来实现文件读取并循环输出
[root@openEuler ~]# cat while2.sh 
#!/bin/bashexec < myfilewhile read line
doecho $line
done
[root@openEuler ~]# bash while2.sh 
open
openlab
openlab123
linux
readhat

方式二:

[root@openEuler ~]# cat while3.sh 
#!/bin/bashwhile read line
doecho $line
done < myfile
[root@openEuler ~]# bash while3.sh 
open
openlab
openlab123
linux
readhat

无限循环

        在while的表达式中,可以指定以下几个特殊值:

true会一直循环,而且它的状态返码是0
false不做任何事情,表示成功,状态码为0
作用与true相同,都是进行无限循环

代码示例:

[root@openEuler ~]# while true ; do echo 123123 ; done   #会一直循环[root@openEuler ~]# while false ; do echo 123123 ; done
[root@openEuler ~]# echo $?
0[root@openEuler ~]# while : ; do echo 123123 ; done

使用示例

        猜商品的价格,通过变量RANDOM来获取随机的价格,然后提示用户猜价格,并记录次数,猜中退出,或次数达到5次也退出

代码示例:

[root@openEuler ~]# cat while4.sh 
#!/bin/bashprice=$[ $RANDOM % 100 ]
time=0while true
doread -p 'Please enter product price [0-99]: ' inputlet time++if [ $input -eq $price ]; thenecho 'Good luck, you guessed it.'echo 'You have guessed $time times.'exit 0elif [ $input -gt $price ]; thenecho "$input is to high"elseecho "$input is to low"fiif [ $time -eq 5 ]; thenecho "You have guessed is 5 times. exit"exit 1fi
done
[root@openEuler ~]# bash while4.sh 
Please enter product price [0-99]: 50
50 is to low
Please enter product price [0-99]: 80
80 is to high
Please enter product price [0-99]: 70
70 is to high
Please enter product price [0-99]: 60
60 is to low
Please enter product price [0-99]: 65
65 is to low
You have guessed is 5 times. exit
[root@openEuler ~]# 

示例:

        使用while读取文件,文件的内容如下:

192.168.72.131  22
192.168.72.132  23
192.168.72.133  22

要求:

        输出的格式为:

IP: 192.168.72.131, PORT: 22
IP: 192.168.72.132, PORT: 23
IP: 192.168.72.133, PORT: 22

代码示例:

# 1. 创建文件
[root@openEuler ~]# cat ips
192.168.72.131  22
192.168.72.132  23
192.168.72.133  22# 2. 编写脚本 
[root@openEuler ~]# cat while6.sh 
#!/bin/bashwhile read line
doIP=`echo $line|cut -d" " -f1`   # 也可以使用awk来实现,如:IP=`echo $line|awk '{print $1}'`PORT=$(echo $line|cut -d " " -f 2)echo "IP:$IP, PORT:${PORT}"
done < ips# 3. 运行测试
[root@openEuler ~]# bash while6.sh 
IP:192.168.72.131, PORT:22
IP:192.168.72.132, PORT:23
IP:192.168.72.133, PORT:22

until循环

        until循环和while循环的作用是一样的,都重复执行某些代码,但是它和while循环也有区别:until循环是条件不满足时才循环,条件满足则退出;而while循环是条件满足都循环,而条件不满足则退出

基本语法

until [ 条件表达式 ]
do要重复执行的语句
done

示例

        循环输出0~10之间的数

代码示例:

[root@openEuler ~]# cat until1.sh 
#!/bin/bashi=0#while [ $i -lt 10 ]
#do
#	echo $i
#	let i++
#doneuntil [ $i -ge 10 ]
doecho $ii=$((i+1))
done[root@openEuler ~]# bash until1.sh 
0
1
2
3
4
5
6
7
8
9

select循环

        select循环语句主要功能是创建选择菜单,在执行带有select循环语句脚本时,会输出按照数字列表

语法格式

select 变量名 [ in 菜单值列表 ]
do语句
done

示例:

        选择MySQL版本

代码示例:

[root@openEuler ~]# cat select1.sh 
#!/bin/bashselect mysql_version in 5.6 5.7 8.0
doecho $mysql_version
done
[root@openEuler ~]# bash select1.sh 
1) 5.6
2) 5.7
3) 8.0
#? 2
5.7
#? 3
8.0
#? ^C

示例:

        选择水果,假如有以下水果可以选择:

        Apple、Banana、Pear、Watermelons、Grape

代码示例:

[root@openEuler ~]# cat select2.sh 
#!/bin/bashecho "Choose your favorite fruit: "
select fruit in Apple Banana Pear Watermelons Grape
doechoecho "Your favorite fruit is $fruit."#break
done[root@openEuler ~]# bash select2.sh 
Choose your favorite fruit: 
1) Apple
2) Banana
3) Pear
4) Watermelons
5) Grape
#? 1Your favorite fruit is Apple.
#? 2Your favorite fruit is Banana.
#? 4Your favorite fruit is Watermelons.
#? ^C

代码完善:

        在上面示例中,没有办法在选择水果后退出,它会一直让我们进行选择,如果希望选择后退出则需要添加break

[root@openEuler ~]# cat select2.sh 
#!/bin/bashecho "Choose your favorite fruit: "
select fruit in Apple Banana Pear Watermelons Grape
doechoecho "Your favorite fruit is $fruit."break
done[root@openEuler ~]# bash select2.sh 
Choose your favorite fruit: 
1) Apple
2) Banana
3) Pear
4) Watermelons
5) Grape
#? 3Your favorite fruit is Pear.
[root@openEuler ~]# 

嵌套循环

示例:

        打印九九乘法表

[root@openEuler ~]# cat ninetable.sh 
#!/bin/bash
for i in `seq 9`
dofor j in `seq 9`do#[ $j -le $i ] && echo -n "$i*$j = `expr $i \* $j`  "[ $j -le $i ] && echo -n "$i*$j = `echo $((i*j))` "doneecho " "
done[root@openEuler ~]# bash ninetable.sh 
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

示例:

        打印三角形(10行10列)

[root@openEuler ~]# cat triangle.sh 
#!/bin/bashfor i in {1..9}
dofor ((col=1;col<10-i;col++))doecho -n " "donefor ((k=1; k<=i; k++))doecho -n "$i "doneecho " "
done[root@openEuler ~]# bash triangle.sh 1  2 2  3 3 3  4 4 4 4  5 5 5 5 5  6 6 6 6 6 6  7 7 7 7 7 7 7  8 8 8 8 8 8 8 8  
9 9 9 9 9 9 9 9 9 

break和continue

        break是用于循环退出,而continue是结束本次循环,进入下一次循环

break的使用

示例:

[root@openEuler ~]# cat break.sh 
#!/bin/bashfor i in `seq 9`
doif [ $i -eq 5 ] ; thenbreakelseecho $ifi
done
[root@openEuler ~]# bash break.sh 
1
2
3
4

continue的使用

示例:

[root@openEuler ~]# cat continue.sh 
#!/bin/bashfor i in `seq 9`
doif [ $i -eq 5 ] ; thencontinueelseecho $ifi
done
[root@openEuler ~]# bash continue.sh 
1
2
3
4
6
7
8
9

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

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

相关文章

计算机网络——常见问题汇总

1. introduction 1.1 Explain what a communication protocol is and why its important. A communication protocol is a set of rules and conventions(公约) that govern(统治) how data is transmitted and received between devices(设备), systems, or entities in a ne…

Linux vim的使用(一键安装则好用的插件_forcpp),gcc的常见编译链接操作

vim 在Linux系统上vim是个功能还比较完善的软件。但是没装插件的vim用着还是挺难受的&#xff0c;所以我们直接上一款插件。 我们只需要在Linux上执行这个命令就能安装(bite提供的) curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh …

Qt中https的使用,报错TLS initialization failed和不能打开ssl.lib问题解决

前言 在现代应用程序中&#xff0c;安全地传输数据变得越来越重要。Qt提供了一套完整的网络API来支持HTTP和HTTPS通信。然而&#xff0c;在实际开发过程中&#xff0c;开发者可能会遇到SSL相关的错误&#xff0c;例如“TLS initialization failed”&#xff0c;cantt open ssl…

pytorch-LSTM

目录 1. RNN存在的问题2. LSTM的由来3. LSTM门3.1 遗忘门3.2 输入门3.3 输出门 4. LSTM是如何减轻梯度弥散问题 1. RNN存在的问题 如下图&#xff1a;RNN能满足预测下一个单词&#xff0c;但是对于获取更多的上下文信息就做不到了。 2. LSTM的由来 RNN能做到短时记忆即shor…

Node.js_mongodb数据迁移

mongodb数据迁移 命令行工具介绍单个迁移整体迁移从mongodb迁移到mysql随着项目业务需求的不断增长变化,数据会在不同的数据库之间互相迁移。本文将介绍mysql和mongodb之间的数据迁移,已在win11系统中实践过。 命令行工具介绍 单个迁移 mongoexport:把一个集合(collectio…

适合创业公司使用的wordpress主题

对于创业公司来说&#xff0c;‌选择一个适合的WordPress主题至关重要&#xff0c;‌它不仅能够提升公司网站的外观和用户体验&#xff0c;‌还能帮助优化搜索引擎排名&#xff0c;‌从而吸引更多的潜在客户。‌以下是一些推荐的WordPress主题&#xff0c;‌特别适合创业公司使…

如何使用断言(Assertions)进行调试

断言&#xff08;Assertions&#xff09;是编程中一种非常有用的调试工具&#xff0c;它允许开发者在代码中设置检查点&#xff0c;以确保程序在特定点上的状态符合预期。如果断言失败&#xff08;即检查点的条件为假&#xff09;&#xff0c;程序通常会抛出一个错误或者异常&a…

抖音运营_商品标题优化关键词优化

一 为什么要优化标题&#xff1f; 标题是爆单的核心因素 有搜索的地方就有关键词检索 抖音现在重点扶持搜索板块 关键词检索不仅为了 消费者、也为了 达人。 二 关键词的组成和原则 1 核心词 n. &#xff08;你卖的东西&#xff09; 示例&#xff1a;连衣裙 2 属性词 …

Linux -- 认识 gdb

目录 前言&#xff1a; Debug 模式和 Release 模式 怎么安装 gdb&#xff1f;&#xff08;CentOS7&#xff09; 怎么使用 gdb&#xff1f; 进入 gdb 模式&#xff1a; 查看代码&#xff1a; 执行代码&#xff1a; 断点&#xff1a; 打断点&#xff1a; 查看断点&#x…

前端埋点数据收集和数据上报

原文地址 什么是埋点 学名叫时间追踪(Event Tracking), 主要针对用户行为或者业务过程进行捕获&#xff0c;处理和发送相关技术及实施过程. 埋点是数据领域的一个专业术语&#xff0c;也是互联网领域的俗称&#xff0c;是互联网领域的俗称 埋点是产品数据分析的基础&#xf…

深度解读李彦宏的“不要卷模型,要卷应用”

深度解读李彦宏的“不要卷模型&#xff0c;要卷应用” —— AI技术的应用之道 引言 在2024世界人工智能大会的舞台上&#xff0c;李彦宏的“不要卷模型&#xff0c;要卷应用”言论犹如一石激起千层浪&#xff0c;引发了业界对AI技术发展路径的深思。本文将深入探讨这一观点&a…

Eagle 4.0 更新了哪些功能,值得购买吗?

这个全新的版本带来了一系列重磅级别的更新&#xff0c;包括全新的「插件系统」、「全新的 UI 风格」以及「AI 工具」等。所有这些&#xff0c;都是为了提供给用户更加优质的使用体验&#xff0c;让工作的流程更加流畅&#xff0c;更加高效。 我们的团队始终倾听用户的声音&am…

C语言:指针详解(5)

目录 一、sizeof()函数和strlen()函数的对比 二、数组和指针笔试题解析 三、指针运算笔试题解析 正文开始 一、sizeof()函数和strlen()函数的对比 1.sizeof()函数 在学习操作符的时候&#xff0c;我们了解了sizeof()函数。sizeof()函数是用来计算变量所占内存空间大小的&a…

Python自定义可切片的类

Python自定义可切片的类 在Python中,要创建一个自定义可切片的对象,你需要实现 __getitem__ 方法。这个方法允许对象支持索引操作,包括切片。 下面是一个简单的例子,展示了如何创建一个支持切片操作的自定义类: class MyList:def __init__(self, data):self.data = dat…

开源 Wiki 系统 InfoSphere 2024.01.1 发布

推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台&#xff0c;建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件&#xff1a;https://github.com/devlive-commun…

Java高风险之在用户界面(UI)中显示敏感数据(Display of sensitive data in the user interface)

风险介绍 Display of sensitive data in the user interface,在用户界面(UI)中显示敏感数据可能带来多种风险,这可能导致信息泄露和不必要的风险,因为敏感数据可能会被截屏、监控软件捕获、或者被旁观者看到。这些风险涉及数据泄露、身份盗用、经济损失和法律处罚等。 数…

算法笔记——LCR

一.LCR 152. 验证二叉搜索树的后序遍历序列 题目描述&#xff1a; 给你一个二叉搜索树的后续遍历序列&#xff0c;让你判断该序列是否合法。 解题思路&#xff1a; 根据二叉搜索树的特性&#xff0c;二叉树搜索的每一个结点&#xff0c;大于左子树&#xff0c;小于右子树。…

男女相貌之秘 -高直上人

描述 高直上人&#xff0c;一个富有才华的老师&#xff01; 对于大家的学习有不可多得的帮助。 内容 目前主要的内容以面相为主&#xff0c;对于学习面相有比较大的帮助&#xff01; 但是网络上面错综复杂&#xff0c;很多老旧的版本影响学习&#xff01; 而这里我整理了相…

软考高级第四版备考--第18天(规划风险管理)Plan Risk Management

定义&#xff1a;定义如何实施项目风险管理活动的过程 作用&#xff1a;确保风险管理的水平、方法和可见度与项目风险程度相匹配&#xff0c;与对组织和其他干系人的重要程度相匹配。 输入&#xff1a;1、项目管理计划&#xff08;在规划项目风险管理时&#xff0c;应考虑所有…

“存算分离“和“湖仓一体“

"存算分离"和"湖仓一体"是在大数据领域中常见的两种数据架构设计理念&#xff0c;用于处理和管理大数据的存储和分析需求。 1. 存算分离&#xff08;StorageCompute Separation&#xff09;&#xff1a; 定义&#xff1a;存算分离是一种架构设计思想&#…