首页 > 其他分享 >流程循环控制语句

流程循环控制语句

时间:2024-07-13 16:28:10浏览次数:9  
标签:语句 示例 流程 sh 循环 openEuler echo root bash

目录

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/bash

for var in 192.168.72.130 192.168.72.131 192.168.72.132
do
	echo $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/bash

for var in 192.168.72.13{0..3}
do
	echo $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/bash

for var in $(seq -f "192.168.72.13%1g" 1 5)
do
	echo $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/bash

for v in {1..10..2}
do
	echo $v
done
[root@openEuler ~]# bash for2.sh 
1
3
5
7
9

示例:

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

代码示例:

[root@openEuler ~]# cat for3.sh 
#!/bin/bash

for file in $(ls -F / | grep -v /$)
do
	echo $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/bash

for word in hello world rabbit favorite eat apple cabbage
do
	if [ `expr length ${word}` -le 6 ]; then
		echo $word
	fi
done
[root@openEuler ~]# bash for4.sh 
hello
world
rabbit
eat
apple

不带列表循环

语法:

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

示例:

        循环输入所有的参数

代码示例:

[root@openEuler ~]# cat for5.sh
#!/bin/bash

for v in $@
do
	echo $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/bash

for ((i=1;i<=30;i++))
do
	if [ $i -lt 10 ]; then
		user=test0$i
	else
		user=test$i
	fi
	if ! id -u $user &> /dev/null
	then
		useradd $user
		echo "Abc123456" | passwd --stdin $user &> /dev/null
	else
		echo "$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/bash

for u in `seq -f "test%02g" 1 30`
do
	if ! id -u $u &>/dev/null
           useradd $u
	   echo "Haha123123" | passwd --stdin $u
	fi
done

while循环

语法

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

示例:

        循环输出1~10这几个数

代码示例:

[root@openEuler ~]# cat while1.sh 
#!/bin/bash

i=1
while [ $i -le 10 ]
do
	echo $i
	let 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/bash

exec < myfile

while read line
do
	echo $line
done
[root@openEuler ~]# bash while2.sh 
open
openlab
openlab123
linux
readhat

方式二:

[root@openEuler ~]# cat while3.sh 
#!/bin/bash

while read line
do
	echo $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/bash

price=$[ $RANDOM % 100 ]
time=0

while true
do
	read -p 'Please enter product price [0-99]: ' input
	let time++
	if [ $input -eq $price ]; then
		echo 'Good luck, you guessed it.'
		echo 'You have guessed $time times.'
		exit 0
	elif [ $input -gt $price ]; then
		echo "$input is to high"
	else
		echo "$input is to low"
	fi
	if [ $time -eq 5 ]; then
		echo "You have guessed is 5 times. exit"
		exit 1
	fi
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/bash

while read line
do
	IP=`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/bash

i=0

#while [ $i -lt 10 ]
#do
#	echo $i
#	let i++
#done

until [ $i -ge 10 ]
do
	echo $i
	i=$((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/bash

select mysql_version in 5.6 5.7 8.0
do
	echo $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/bash

echo "Choose your favorite fruit: "
select fruit in Apple Banana Pear Watermelons Grape
do
	echo
	echo "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
#? 1

Your favorite fruit is Apple.
#? 2

Your favorite fruit is Banana.
#? 4

Your favorite fruit is Watermelons.
#? ^C

代码完善:

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

[root@openEuler ~]# cat select2.sh 
#!/bin/bash

echo "Choose your favorite fruit: "
select fruit in Apple Banana Pear Watermelons Grape
do
	echo
	echo "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
#? 3

Your favorite fruit is Pear.
[root@openEuler ~]# 

嵌套循环

示例:

        打印九九乘法表

[root@openEuler ~]# cat ninetable.sh 
#!/bin/bash
for i in `seq 9`
do
	for 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))` "
	done
	echo " "
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/bash

for i in {1..9}
do
	for ((col=1;col<10-i;col++))
	do
		echo -n " "
	done
	for ((k=1; k<=i; k++))
	do
		echo -n "$i "
	done
	echo " "
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/bash

for i in `seq 9`
do
	if [ $i -eq 5 ] ; then
		break
	else
		echo $i
	fi
done
[root@openEuler ~]# bash break.sh 
1
2
3
4

continue的使用

示例:

[root@openEuler ~]# cat continue.sh 
#!/bin/bash

for i in `seq 9`
do
	if [ $i -eq 5 ] ; then
		continue
	else
		echo $i
	fi
done
[root@openEuler ~]# bash continue.sh 
1
2
3
4
6
7
8
9

标签:语句,示例,流程,sh,循环,openEuler,echo,root,bash
From: https://blog.csdn.net/qq_64227183/article/details/138008705

相关文章

  • 2024上半年软考电子证书已可下载!附下载打印流程(7月11号即可下载了)
    一、中国人事考试网,可以看到证书样式1.进入中国人事考试网中国人事考试网(cpta.com.cn)http://www.cpta.com.cn/如下图所示:​2.点击证书查验 没注册的同学请先注册然后再登录,登录之后即可看到以下界面:​3.点击下载证书样式如下所示:二、中国计算机技术职业......
  • 7-循环队列的基本操作
    顺序队列的操作#include<stdio.h>#include<stdlib.h>#include<stdbool.h>typedefintElemType;#defineMaxSize50/*顺序队列的类型定义*/typedefstruct{/*用一维数组存放队列元素*/ElemTypedata[MaxSize];/*队头指针*/intfront;/*......
  • C语言-分支与循环(1)
    目录1、if语句1.1if1.2else1.3分支中包含多条语句1.4嵌套if1.5悬空else问题(多个if和一个else对应关系)2、switch语句2.1switch语句中的break2.2switch语句中的default2.3switch语句中的case和default的顺序问题3、关系操作符4、条件操作符4.1什么是条件......
  • 嵌入式C++、Qt/QML和MQTT:智能工厂设备监控系统的全流程介绍(附代码示例)
    1.项目概述本项目旨在开发一套先进的智能工厂设备监控系统,集成嵌入式技术、工业通信协议和人机界面等多项技术,实现对工厂设备的全方位实时监控、高精度数据采集和智能化分析。该系统将显著提升工厂设备的运行效率,大幅降低维护成本,并为管理层决策提供可靠的数据支持。主要功......
  • 917、基于51单片机的出租车计价器(昼夜,LCD1602,步进电机,里程,单价)(程序+Proteus仿真+原理
    毕设帮助、开题指导、技术解答(有偿)见文未目录方案选择单片机的选择显示器选择方案一、设计功能二、Proteus仿真图单片机模块设计三、原理图四、程序源码资料包括:需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。方案选择......
  • spark-submit提交任务时执行流程(简单版)
    yarncluster模式提交spark任务(1)执行脚本提交任务,实际是启动一个SparkSubmit的JVM进程。(2)SparkSubmit类中的main方法反射调用YarnClusterApplication的main方法。(3)YarnClusterApplication创建Yarn客户端,然后向yarn服务器发送执行指令:bin/javaApplicationMaster。(4)Yarn(Resour......
  • 开通免费企业域名邮箱流程
    利用163开通免费的企业域名邮箱域名购买在此以腾讯云为例登录后先去完善实名认证信息个人建议二级域名和公司名称相关,简短好记个人建议一级域名选择com、cn、cc、net、top等一级域名找到喜欢的域名后,注意下拉查看续费价格,是否可以接受确认好价格和购买时间,然后选......
  • 机器学习代谢组学分析全流程 高分文章“利器”!
    代谢组学是对某一生物或细胞在一特定生理时期内所有代谢产物同时进行定性定量分析的学科,被广泛用于揭示小分子与生理病理效应间的关系。目前,代谢组学已经被应用于药物开发的各个阶段(如药物靶标识别、先导化合物发现、药物代谢分析、药物响应和耐药研究等)。基于代谢组学的高性价......
  • 易优cms网站for功能:数据/记录循环输出标签(注:类似与volist、foreach标签)-Eyoucms
    【基础用法】名称:for功能:数据/记录循环输出标签(注:类似与volist、foreach标签)语法:{eyou:forstart='开始值'end='结束值'}{$i}{/eyou:for}php解析后的代码是:for($i=1;$i<100;$i+=1){echo$i;}参数:start=''开始值end=''结束值comparison=''比较操作符,默认是小于......
  • 易优cms网站volist功能:数据/记录循环输出标签-Eyoucms
    【基础用法】名称:volist功能:数据/记录循环输出标签语法:{eyou:channeltype='top'}      {eyou:volistname='$field.children'id='field1'}<ahref='{$field1.typeurl}'>{$field1.typename}</a>{/eyou:volist}{/eyou:channel}文件:无参数:......