【LinuxShell】Shell编程之循环语句

article/2025/8/2 20:27:21

文章目录

  • 前言
  • 一、循环
    • 1.循环的作用
    • 2.循环和遍历
  • 二、for循环语句
    • 1.for语句的用法
    • 2.for逻辑结构
    • 3.for语句的格式
    • 4.echo的用法
    • 5.for语句的典型案列
  • 三、while循环语句
    • 1.while语句的用法
    • 2.while逻辑结构
    • 3.while语句的格式
    • 4.while语句的典型案例
  • 四、until命令
    • 1.until语句的用法
    • 2.until逻辑结构
    • 3.until语句的格式
    • 4.until语句的典型案例
  • 五、控制循环流程命令
    • 1.break
    • 2.continue


前言

  循环(Loop)是计算机编程中非常重要的一种结构,其主要目的是为了简化代码编写,提高代码的重复利用率,以及提高程序的效率。

一、循环

1.循环的作用

  • 重复执行代码:通过使用循环,可以在程序中重复执行一段代码,从而避免代码的重复编写,
    减少程序代码量,提高程序的可读性和可维护性。

  • 简化程序逻辑:使用循环可以使程序逻辑更加简洁明了,提高程序的可读性和可理解性,降低代码出错的可能性。

  • 提高代码的重复利用率:通过将重复的代码封装在循环结构中,可以提高代码的重复利用率,减少代码冗余。

  • 提高程序的效率:循环可以让程序自动化地执行重复任务,从而减少人工干预的次数,提高程序的效率和性能。

2.循环和遍历

  循环(Loop)和遍历(Traversal)是两个在计算机编程中经常使用的概念。

  循环是一种重复执行一段代码的结构。通过循环,可以在满足一定条件的情况下,多次执行相同的代码。循环语句通常包括一个循环体(Loop Body)和一个循环条件(Loop Condition),当循环条件满足时,循环体会被执行,否则循环结束。

  而遍历是指对一组数据结构中的每个元素进行一次访问的过程。在计算机编程中,常常需要对数组、列表、树等数据结构中的每个元素进行遍历,以便对它们进行操作或者输出。

  循环是一种控制流程的结构,用于重复执行一段代码,而遍历是一种数据操作的过程,用于访问并处理数据结构中的每个元素。在某些情况下,循环和遍历可以结合使用,以便在循环中遍历数据结构并对其进行操作。

二、for循环语句

1.for语句的用法

  • 读取不同的变量值,用来逐个执行同一组命令。
  • for循环经常使用在已经知道要进行多少次循环的场景。
  • 使用for循环语句时,需要指定一个变量及可能的取值列表,针对每一个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。在这里,“取值列表”称为for语句的执行条件,其中包括多个属性相同的对象,需要预定指定。

2.for逻辑结构

在这里插入图片描述

  for语句的执行流程:首先将循环列表中的元素赋值给变量,每次赋值便执行一次循环,done就标志着一个循环的结束。直到列表中的元素消耗殆尽,结束整个循环。

3.for语句的格式

一般格式

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

注:变量可以不加$in 取值列表可以不写。

类C语言格式

for ((expr1;expr2;expr3))
do命令序列
doneexpr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出

死循环

for ((;;))
do命令序列
done

4.echo的用法

echo -n 表示不换行输出。
echo -e 输出转义字符,将转义后的内容输出到屏幕上

只有加了-e才能执行下面的转义符:

常用的转义字符如下:

转义符含义
\b转义后相当于按退格键(backspace),但前提是"\b"后面存在字符;“\b"表示删除前一个字符,”\blb"表示删除前两个字符
\c不换行输出,在"\c"后面不存在字符的情况下,作用相当于echo -n;但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出
\n换行,被输出的字符从"\n"处开始另起一行。
\f换行,但是换行后的新行的开头位置连接着上一行的行尾;\v 与\f相同
\t转以后表示插入tab,即横向制表符
\r光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖
\\表示插入"\"本身

5.for语句的典型案列

为用户批量添加密码,用户信息保存在opt/目录下。

[root@localhost ~]# vim user.sh
#!/bin/bash
for i in $(cat /opt/user.txt )
douseradd $iecho 123456 | passwd --stdin $i
done
[root@localhost ~]# bash user.sh
更改用户zhangsan的密码。
passwd:所有的身份验证令牌己经成功更新。
更改用户lisi的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户wangwu的密码。
passwd:所有的身份验证令牌已经成功更新。
更改用户zhaoliu的密码。
passwd:所有的身份验证令牌己经成功更新。

画一条直线

[root@localhost ~]# vim abc.sh
for ((i=1;i<=9;i++))
doecho "*"
done
~   
[root@localhost ~]# bash abc.sh
*
*
*
*
*
*
*
*
*

九九乘法表

[root@localhost ~]# vim sum.sh
for ((i=1;i<=9;i++))
dofor ((j=1;j<=i;j++))doecho -ne "$i*$j=$(($i*$j))\t"done
echo
done
[root@localhost ~]# bash sum.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

三、while循环语句

1.while语句的用法

  for循环语句非常适用于列表对象无规律,且列表来源已固定(如某个列表文件)的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用另一种循环——while语句。

  while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环

2.while逻辑结构

在这里插入图片描述

  while语句的执行流程:先对定义的条件进行判断,如果该条件成立,就进入循环,执行 while 循环体中的语句,也就是 do 和 done 之间的语句。这样就完成了一次循环。每一次执行到 done 的时候都会重新判断条件是否成立,如果成立,就进入下一次循环,继续执行 do 和 done 之间的语句,如果不成立,就结束整个 while 循环,执行 done 后面的其它 Shell 代码。如果一开始条件就不成立,那么程序就不会进入循环体,do 和 done 之间的语句就没有执行的机会。

  注意,在 while 循环体中必须有相应的语句使得条件越来越趋近于“不成立”,只有这样才能最终退出循环,否则 while 就成了死循环,会一直执行下去,永无休止。

3.while语句的格式

一般格式

定义变量
while 表达式(条件)
do
循环语句命令
done

死循环

while  [1 -eq 1]  		 #判断条件写一个永久为真的条件 
do      				 #一直执行do内的命令
donewhile  true       		 #直接写判断条件为真
do                       #一直执行do内的命令
donewhile :                  #判断条件为冒号也表示死循环do                      #一直执行do内的命令done

4.while语句的典型案例

批量建立用户

#!/bin/bash
i=0
while [ "${i}" -le 20 ]
douseradd stu${i}echo "123456" |passwd --stdin stu${i} &>/dev/nullif [ $? -eq 0 ]thenecho "用户 stu${i} 被建立"elseecho "用户 stu${i} 建立失败"filet i++
done

批量删除用户

#!/bin/bash
i=0
while [ "${i}" -le 20 ]
douserdel -r stu${i}let i++
done

猜价格游戏

#!/bin/bash
p=`echo $[RANDOM%1000+1]`
t=0while true
doread -p "请输入商品的价格1-1000:" numlet t++if [ $num -eq $p ]thenecho "恭喜你猜中了,实际价格是$p"echo "一共猜了${t}次"exit 0elif [ $num -gt $p ]thenecho "猜的价格高了" elseecho "猜的价格低了"fi
done

四、until命令

1.until语句的用法

  until循环执行一系列命令直至条件为真时停止。until循环与while循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候—也只是极少数情况下,until循环更加有用。

2.until逻辑结构

在这里插入图片描述

  until语句的执行流程:先对定义的条件进行判断,如果该条件不成立,就进入循环,执行 until 循环体中的语句,也就是 do 和 done 之间的语句。这样就完成了一次循环。每一次执行到 done 的时候都会重新判断条件是否成立,如果还是不成立,就进入下一次循环,继续执行 do 和 done 之间的语句,如果成立了,就结束整个 until 循环,执行 done 后面的其它 Shell 代码。如果一开始条件就成立,那么程序就不会进入循环体,do 和 done 之间的语句就没有执行的机会。

3.until语句的格式

until  [ 条件测试操作 ]
do判断式/命令序列
done

4.until语句的典型案例

[root@localhost opt]# vim until.sh
i=0
sum=0
until [ $i -gt 10 ]
doecho $ilet i++sum=$(($sum+$i))
done

五、控制循环流程命令

1.break

  在循环内部,当执行到 break 命令时,会立即跳出当前的循环,停止循环执行,然后继续执行下一条指令。可以使用 break 命令来提前终止循环,例如当达到特定条件时或者已经执行了足够的次数。

[root@localhost opt]# vim break.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                			##第二层for循环判断语句执行命令,break控制循环的流程break 2         fi               		 		##if语句结束echo "$i"         					##第二层for循环语句执行每循环一次输出$idone             					##第二层for循环语句结束标志                   
done     								##第一层for循环语句结束标志                                           

2.continue

  在循环内部,当执行到 continue 命令时,会跳过本次循环剩余的代码,并继续下一次循环。可以使用 continue 命令来跳过循环中的某些操作,例如在特定条件下跳过一次循环,或者只执行符合条件的循环。

[root@localhost opt]# vim continue.sh
#!/bin/bash
for i in [1..5]
doif [ $i -eq 2 ]thencontinuefiecho "$i"
done
[root@localhost opt]# vim continue.sh
1
3
4
5


http://chatgpt.dhexx.cn/article/1WZb0PRg.shtml

相关文章

【Linux】:shell循环语句

运行Shell脚本有两种方法&#xff1a; 1、vi test.sh #! /bin/bash #编写内容 运行sh test.sh 2、chmod x ./test.sh #脚本具有执行权限 ./test.sh #执行脚本 if条件判断 单分支if条件&#xff1a; if [ 条件判断式 ]then程序 fi注意&#xff1a;中括号与条件判断式之间有空…

shell脚本循环执行一个linux命令,shell脚本编程之循环语句

在运行脚本时重复执行一系列的命令是很常见的&#xff0c;这时我们就需要使用循环语句来达到这个目的。 一、for命令 格式&#xff1a;for 变量 in 列表&#xff1b;do 循环体 done for命令会遍历列表中的每一个值&#xff0c;并且在遍历完成后退出循环。 列表形式有以下几种&a…

Linuxshell脚本之循环语句

目录 一、循环 1.循环的含义 2.重复运行次数 3.常见的循环命令 4.循环示意图 二、For语句 1.定义 2.表达式 &#xff08;1&#xff09;for循环 &#xff08;2&#xff09;算术for循环 &#xff08;3&#xff09;嵌套 ​ 三、while语句 1定义 2.格式 3.while循…

【Linux】 Shell循环

for循环遍历 { }C语言风格的for 遍历 while 循环 while test测试成立 do命令 donewhile : # 相当于while true until循环 与while 循环相反 until 循环 while test测试不成立 do命令 donecontinue & break 嵌套的时候 if 要和 fi 在一起 do 要和done 在一起 (相邻最…

二、马尔可夫决策过程与贝尔曼方程

这里写目录标题 1 马尔可夫性质2 马尔可夫过程3 马尔可夫奖励过程&#xff08;Markov reward process, MRP&#xff09;3.1 MRP的贝尔曼方程3.2 MRP的贝尔曼方程求解方法3.3 总结 4 马尔可夫决策过程&#xff08;Markov decision process, MDP&#xff09;4.1 MDP状态价值函数贝…

马尔可夫决策过程和贝尔曼方程

马尔可夫决策过程&#xff08;MDP)简介 下一个状态 S t 1 S_{t1} St1​是从概率分布P中得到的&#xff0c;该概率分布P取决于整个历史&#xff0c;因此我们需要考虑从 s 0 s_0 s0​开始到t时刻的状态。马尔可夫是具有马尔可夫性质的随机过程 定义 P [ S t 1 ∣ S t ] P [ …

贝尔曼方程(Bellman Equation)

贝尔曼方程&#xff08;Bellman Equation&#xff09;也被称作动态规划方程&#xff08;Dynamic Programming Equation&#xff09;&#xff0c;由理查贝尔曼&#xff08;Richard Bellman&#xff09;发现&#xff0c;由于其中运用了变分法思想&#xff0c;又被称之为现代变分法…

强化学习:贝尔曼方程(Bellman Equation)

∗ ∗ 重点&#xff1a;状态值、贝尔曼方程 ∗ ∗ **重点&#xff1a;状态值、贝尔曼方程** ∗∗重点&#xff1a;状态值、贝尔曼方程∗∗ return评估策略 在前面概念介绍中&#xff0c;我们知道了可以用 return 来评估一个策略的好坏。如图&#xff0c;有三个不同的策略&…

贝尔曼方程推导

马尔可夫的动态特性&#xff1a; 回报&#xff1a;&#xff08;两种定义&#xff09; 或 &#xff08;折扣率大于等于0小于等于1&#xff0c;折扣率决定了未来收益的现值&#xff09; 状态价值函数&#xff1a;从状态s开始&#xff0c;智能体按照策略π进行决策所获得回报的…

【机器学习】带你轻松理解什么是强化学习中的贝尔曼方程

系列文章目录 第十八章 Python 机器学习入门之强化学习 目录 系列文章目录 前言 一、什么是贝尔曼方程 二、贝尔曼方程为什么有用 三、贝尔曼方程是怎么来的 总结 前言 贝尔曼方程是强化学习中最重要的一个方程式。如果可以计算状态S 的状态动作函数 Q(s,a)&#xff0c…

强化学习/动态规划:贝尔曼方程的解读 Bellman Equation 贝尔曼方程组 / 贝尔曼最优方程

前言&#xff1a; 读书《Reinforcement Learning: An Introduction Second Edition》&#xff0c;读到第三章有限马尔科夫决策过程MDP中&#xff0c;提到了贝尔曼方程的理解。一开始我是有点懵逼的&#xff0c;现在看懂了其意思&#xff0c;在这里解释一下。 贝尔曼方程理解 下…

贝尔曼方程

贝尔曼方程在强化学习中无处不在&#xff0c;对于理解强化学习算法的工作原理是非常必要的。贝尔曼方程让我们可以开始解决MDPs问题。 贝尔曼期望方程 贝尔曼最优方程 将贝尔曼期望方程与贝尔曼最优方程进行对比&#xff0c;可以发现&#xff0c;贝尔曼期望方程是对于某一个给…

【RL】Bellman Equation 贝尔曼方程(动态规划)

参考&#xff1a;蘑菇书-《EasyRL》 本文只是为了方便自己今后的查阅对原文做出的一些概括。 马尔可夫奖励过程MRP 马尔可夫奖励过程是马尔可夫链加上奖励函数&#xff0c;奖励函数R是一个期望&#xff0c;表示到达某一个状态时可以获得多大的奖励。如果状态数是有限的&#x…

3.1 贝尔曼(bellman)方程

假设智能体观测到状态 s 0 s_0 s0​&#xff0c;并且有 N N N个可用action&#xff0c;每个action都会导致另一种状态&#xff0c;及相应的奖励。另外&#xff0c;假设我们知道与状态s0相连的所有状态的价值 V i V_i Vi​。在这种情况下&#xff0c;智能体可以采取的最佳行动是…

强化学习之贝尔曼方程

强化学习 强化学习注重智能体&#xff08;agent&#xff09;与环境之间的交互式学习&#xff1a; 强化学习的数据集不是训练初始阶段就有的&#xff0c;而是来自智能体与环境交互才能获得&#xff1b;强化学习不追求单步决策的最优策略&#xff0c;而是追求与环境交互获得的长…

强化学习笔记:策略评估--贝尔曼方程求解示例

目录 1. 前言 2. MDP模型 3. 求解贝尔曼方程 1. 前言 策略评估&#xff08;Policy Evaluation&#xff09;&#xff0c;简单来说&#xff0c;就是针对某个既定的策略求其状态值函数和动作值函数。求得了状态值函数和动作值函数&#xff0c;事实上就很容易进行不同候补策略之…

强化学习笔记:策略、值函数及贝尔曼方程

目录 1. 前言 2. 策略和值函数的定义 3. 值函数的估计 4. 状态值函数的贝尔曼方程 1. 前言 本篇介绍策略、两种值函数&#xff08;状态值函数和动作值函数&#xff09;&#xff0c;以及大名鼎鼎的贝尔曼方程。补充了一点关于贝尔曼方程的推导过程&#xff0c;希望能够帮助理…

贝尔曼最优方程(Bellman Optimality Equation)

贝尔曼最优方程 目录回顾 补充逻辑场景设置 贝尔曼最优方程最优策略与最优价值函数最优状态价值函数最优状态-动作价值函数 小小的题外话 - 最大值/期望值最大值和期望值之间的大小关系 最优策略与两种价值函数间的关系贝尔曼最优方程表达式 本节使用 更新图的方式对 V π ( …

价值函数与贝尔曼方程

一.价值函数 由于在面对不同的状态时&#xff0c;智能体需要选择最优的动作&#xff0c;到达更优的状态以得到更多的奖励.那么我们根据什么判别一个状态或动作的的好坏程度呢&#xff1f;我们引入价值函数。 价值函数的定义是&#xff1a;获得回报的期望。 1.状态价值函数 …

强化学习: 贝尔曼方程与马尔可夫决策过程

强化学习&#xff1a; 贝尔曼方程与马尔可夫决策过程 一、简介 贝尔曼方程和马尔可夫决策过程是强化学习非常重要的两个概念&#xff0c;大部分强化学习算法都是围绕这两个概念进行操作。尤其是贝尔曼方程&#xff0c;对以后理解蒙特卡洛搜索、时序差分算法以及深度强化学习算…