Shell基础之流程循环控制语句

目录

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/872328.shtml

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

相关文章

对于GPT-5在一年半后发布的期待!

首先&#xff0c;如果GPT-5真如OpenAI首席技术官米拉穆拉蒂&#xff08;Mira Murati&#xff09;在采访中所透露的那样&#xff0c;在一年半后发布&#xff0c;并在某些领域达到博士级的智能&#xff0c;这无疑将是一个令人振奋的消息。这一预测不仅反映了AI技术的快速发展&…

MPAS跨尺度、可变分辨率模式实践技术

跨尺度预测模式&#xff08;The Model for Prediction Across Scales - MPAS&#xff09;是由洛斯阿拉莫斯实验室和美国国家大气研究中心(NCAR)共同开发&#xff0c;其由3个部分组成&#xff0c;分别称为 MPAS-A&#xff08;大气模型&#xff09;、MPAS-O&#xff08;海洋模型&…

python实例练习00001:打开文件输出文件内容

try:file input(enter the file :)with open(file, r) as f:data f.read()print(data) except FileNotFoundError:print(fthe file {file} does not exists:) 打开windows的cmd运行程序&#xff0c;效果如下&#xff1a;

MyBatis-Plus字段类型处理器介绍以及使用

文章目录 前言自定义 TypeHandler1. 创建 TypeHandler 类2. 注册自定义 TypeHandler2.1. 在 MyBatis XML 配置文件中注册&#xff1a;2.2. 在 Spring Boot 中注册&#xff1a;2.3. 在 Spring Boot配置文件注册&#xff1a; 3. 使用 TypeHandler3.1 在实体类属性上使用3.2 在 XM…

vscode常用组件

1.vue-helper 启用后点击右下角注册&#xff0c;可以通过vue组件点击到源码里面 2.【Auto Close Tag】和【Auto Rename Tag】 3.setting---Auto Reveal Exclude vscode跳转node_modules下文件&#xff0c;没有切换定位到左侧菜单目录> 打开VSCode的setting配置&#xff…

非法闯入智能监测摄像机:安全守护的新利器

在当今社会&#xff0c;安全问题愈发受到重视。随着科技的进步&#xff0c;非法闯入智能监测摄像机应运而生&#xff0c;成为保护家庭和财产安全的重要工具。这种摄像机不仅具备监控功能&#xff0c;还集成了智能识别和报警系统&#xff0c;能够在第一时间内检测到潜在的入侵行…

xxs攻击的攻击和防范

随着互联网技术的飞速发展&#xff0c;网络安全问题日益凸显。跨站脚本攻击&#xff08;XSS 攻击&#xff09;作为一种常见的网络攻击手段&#xff0c;给网络应用和用户数据安全带来了严重威胁。本文深入探讨了 XSS 攻击的原理、分类、危害以及相应的防范措施&#xff0c;旨在提…

第七天 SpringBoot与SpringCloud微服务项目交付

Spring Cloud微服务项目交付 微服务扫盲篇 微服务并没有一个官方的定义&#xff0c;想要直接描述微服务比较困难&#xff0c;我们可以通过对比传统WEB应用&#xff0c;来理解什么是微服务。 单体应用架构 如下是传统打车软件架构图&#xff1a; 这种单体应用比较适合于小项…

图像处理中的Scharr算子的原理,并附OpenCV和MATLAB示例代码

Scharr算子是图像处理中的一种边缘检测算子&#xff0c;主要用于计算图像梯度的边缘检测。与Sobel算子类似&#xff0c;Scharr算子也使用卷积核来计算图像的导数&#xff0c;但Scharr算子在精度和抗噪性方面表现更优。其原理如下&#xff1a; 原理 梯度计算 在图像处理中&…

服务器数据恢复—raid5阵列热备盘同步失败导致lun不可用的数据恢复案例

服务器存储数据恢复环境&#xff1a; 华为S5300存储中有一组由16块FC硬盘组建的RAID5磁盘阵列&#xff08;包含一块热备盘&#xff09;。 服务器存储故障&#xff1a; 该存储中的RAID5阵列1块硬盘由于未知原因离线&#xff0c;热备盘上线并开始同步数据&#xff0c;数据同步到…

Android C++系列:Linux文件系统(二)

1. VFS虚拟文件系统 Linux支持各种各样的文件系统格式&#xff0c;如ext2、ext3、reiserfs、FAT、NTFS、iso9660 等等&#xff0c;不同的磁盘分区、光盘或其它存储设备都有不同的文件系统格式&#xff0c;然而这些文件系统 都可以mount到某个目录下&#xff0c;使我们看到一个…

如何提升运维管理的精细化管理能力

在当今这个信息化的时代&#xff0c;运维管理已经成为企业IT架构中不可或缺的一环。随着企业业务的不断扩张和技术的日益复杂&#xff0c;提升运维管理的精细化管理能力显得尤为重要。精细化管理不仅能够提高企业的运营效率&#xff0c;还能有效降低运维成本&#xff0c;为企业…

最新PHP自助商城源码,彩虹商城源码

演示效果图 后台效果图 运行环境&#xff1a; Nginx 1.22.1 Mysql5.7 PHP7.4 直接访问域名即可安装 彩虹自助下单系统二次开发 拥有供货商系统 多余模板删除 保留一套商城,两套发卡 源码无后门隐患 已知存在的BUG修复 彩虹商城源码&#xff1a;下载 密码:chsc 免责声明&…

Qt篇——一行代码将一个函数放到子线程中执行

话不多说&#xff0c;直接上代码&#xff1a; //先在.pro文件中启用concurrent, 如: QT core gui concurrent//主线程的函数, 线程函数传了1个int型参数 2 void MainWidget::test() {//一行代码实现将函数放到子线程中执行QtConcurrent::run(this, &MainWidget::…

微前端:乾坤 、无界、single-spa、iframe对比

一、微前端框架概述 微前端框架是一种技术解决方案&#xff0c;旨在将大型前端应用拆分为多个小型、独立、可维护的微前端应用&#xff0c;每个微前端应用可以独立开发、测试、部署和运行&#xff0c;同时保持整体的协同工作和用户体验。这种架构类似于微服务架构&#xff0c;…

go 的HTTP请求处理

使用 Go 处理 HTTP 请求主要涉及两件事&#xff1a;ServeMuxes 和 Handlers。 ServeMux本质上是一个 HTTP 请求路由器&#xff08;或多路复用器&#xff09;。它将传入的请求与预定义的 URL 路径列表进行比较&#xff0c;并在找到匹配时调用路径的关联 handler。handler 负责写…

05 以物品与用户为基础个性化推荐算法的四大策略

《易经》&#xff1a;“九二&#xff1a;见龙在田&#xff0c;利见大人”。九二是指阳爻在卦中处于第二位&#xff0c;见龙指龙出现在地面上&#xff0c;开始崭露头角&#xff0c;但是仍须努力&#xff0c;应处于安于偏下的位置。 本节是模块二第一节&#xff0c;模块二讲解传…

Vue3.0中实现的动态路由权限控制

文章目录 前言功能分析代码详细解释 前言 动态路由权限控制是项目常用的功能&#xff0c;这里介绍一种方式&#xff0c;通过将后端权限码与本地路由的JSON配置ID进行匹配&#xff0c;能够有效地实现用户权限的控制。不同角色的操作项是根据权限码匹配到的路由进行区分的&#…

Python中的数据结构:五彩斑斓的糖果盒

在Python编程的世界里&#xff0c;数据结构就像是一个个五彩斑斓的糖果盒&#xff0c;每一种糖果都有其独特的味道和形状。这些多姿多彩&#xff0c;形状和味道各异的糖果盒子包括了&#xff1a;List&#xff08;列表&#xff09;、Tuple&#xff08;元组&#xff09;、Diction…

如何保证数据库和redis的数据一致性

1、简介 在客户端请求数据时&#xff0c;如果能在缓存中命中数据&#xff0c;那就查询缓存&#xff0c;不用在去查询数据库&#xff0c;从而减轻数据库的压力&#xff0c;提高服务器的性能。 2、问题如何保证两者的一致性 先更新数据库在删除缓存 难点&#xff1a;如何保证…