当前位置: 首页 > article >正文

泷羽sec-shell(7)for循环与while循环 学习笔记

  声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[B站泷羽sec](泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频)

本章课程链接:shell(7)for循环与while循环_哔哩哔哩_bilibili

一、for循环

1. 反引号 ``

在 Shell 中,反引号(`)用于命令替换。这意味着可以在反引号中放入一个命令,然后在执行包含反引号的语句时,会先执行反引号中的命令,并用命令的输出结果来替换反引号中的内容。

在for循环中使用反引号执行命令的示例
假设要遍历当前目录下所有文件的文件名,可以使用ls命令。以下是一个for循环结合反引号的示例:

for file in `ls`; do
    echo "文件名是: $file"
done

解释:
for file in ls``:在这个部分,ls命令被放在反引号中。当 Shell 开始执行这个for循环时,首先会执行ls命令。ls命令会列出当前目录下的所有文件和目录的名称,这些名称会以空格为分隔符形成一个列表。然后for循环会将这个列表中的每个元素依次赋值给变量file。
do和done之间的部分是循环体。echo "文件名是: $file"会输出每个文件名,其中$file是当前循环中被赋值的文件名。

注意事项
反引号中的命令如果输出包含特殊字符(如空格、制表符等),可能会导致意外的结果。例如,如果文件名中有空格,上述for循环可能会将文件名错误地分割。在这种情况下,可以使用$( )来代替反引号进行命令替换,例如for file in $(ls); do...,不过它也有同样的潜在问题。更安全的做法是使用find命令并结合-maxdepth和-type等选项来处理文件列表,如for file in $(find. -maxdepth 1 -type f); do...,这样可以更准确地获取文件列表,特别是在处理包含特殊字符的文件名时。
 

2.$()

在 Shell 中,$()是一种命令替换的语法。它的功能与反引号()类似,都是用于执行其中的命令,并将命令的输出结果作为值来替换或反引号部分。使用()` 的语法更加清晰,特别是在嵌套使用命令替换时,可读性更好。

命令替换的概念
在for循环中使用$()的示例
例如,要遍历当前目录下所有以.txt结尾的文件的文件名,可以使用find命令结合$()在for循环中进行操作,如下所示:

for file in $(find. -name "*.txt" -maxdepth 1); do
    echo "文件名是: $file"
done

解释:
$(find. -name "*.txt" -maxdepth 1)部分:
find命令用于查找文件。在这里,find的参数含义如下:
.表示从当前目录开始查找。
-name "*.txt"表示查找文件名是以.txt结尾的文件。
-maxdepth 1表示只在当前目录(深度为 1)查找,不包括子目录中的文件。
整个$(find. -name "*.txt" -maxdepth 1)会先执行find命令,得到一个包含所有符合条件(当前目录下以.txt结尾)的文件列表,这些文件名以空格分隔。
for file in...部分:将find命令输出的文件列表中的每个文件名依次赋值给变量file。
echo "文件名是: $file"部分:在循环体中,每次循环都会输出当前文件名,其中$file是当前循环中被赋值的文件名。

与反引号的对比及优势

相比于反引号,$()的嵌套使用更加清晰。

3.双括号  ((  ))

双括号(( ))的基本用途
在 Shell 中,双括号(( ))主要用于算术运算。它允许进行更复杂的数学表达式计算,并且语法更接近传统的编程语言中的算术运算语法。在for循环中使用双括号可以方便地控制循环变量的算术运算。

示例一:简单的数字序列循环
以下是一个使用双括号(( ))在for循环中生成数字序列的例子:

for ((i = 1; i <= 5; i++)); do
    echo $i
done

解释:
((i = 1; i <= 5; i++))部分:
这是for循环的控制表达式,放在双括号中。其中:
i = 1是初始化部分,将变量i初始化为 1。
i <= 5是条件判断部分,每次循环开始时,会检查i的值是否小于等于 5。
i++是迭代部分,在每次循环体执行完后,i的值会自增 1。
echo $i部分:在循环体中,每次循环都会输出变量i的当前值。所以这个循环会依次输出 1、2、3、4、5。

示例二:基于算术运算的条件控制
假设要输出 1 到 10 之间的偶数,可以这样写:

for ((i = 2; i <= 10; i += 2)); do
    echo $i
done

解释:
((i = 2; i <= 10; i += 2))部分:
初始化i为 2,条件判断是i <= 10,迭代部分是i += 2,这意味着每次循环i的值会增加 2。这样就可以保证只输出偶数。
循环体echo $i会输出每次循环时i的当前值,所以会输出 2、4、6、8、10。

与其他语法的比较
与使用[ ]进行条件判断的for循环相比,(( ))在进行算术运算时更加灵活和方便。例如,在[ ]中进行算术运算需要使用一些特殊的语法,如i=$((i + 1))(在循环体内部)来实现变量的自增,而在(( ))中可以直接使用i++这样自然的算术运算语法。同时,(( ))可以处理更复杂的算术表达式,例如((i = i * 2 + 1)),这在[ ]语法中会比较复杂。

二、while循环

在 Shell 脚本中,while循环是一种控制流结构,用于在满足特定条件时重复执行一段代码块。只要条件为真,循环就会持续进行,直到条件变为假。

语法结构
基本语法如下:

while [ 条件表达式 ]
do
    循环体(要执行的命令或代码块)
done

其中,[ 条件表达式 ]部分用于判断循环是否继续执行。这个表达式通常会使用比较运算符(如-eq(等于)、-ne(不等于)、-gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于))来对数值进行比较,或者使用字符串比较运算符(如=、!=)来比较字符串,也可以包含文件测试运算符(如-e(存在)、-f(普通文件)、-d(目录)等)来检查文件相关的属性。do和done之间的部分就是循环体,这里面放置的是每次循环需要执行的命令。

执行流程
当脚本执行到while循环时,首先会对[ 条件表达式 ]进行计算。如果条件表达式的计算结果为真(在 Shell 脚本中,通常返回值为 0 表示真),那么就会执行do和done之间的循环体代码。在循环体执行完毕后,会再次对[ 条件表达式 ]进行计算,只要结果仍然为真,就会再次执行循环体,如此反复,直到[ 条件表达式 ]的计算结果为假(返回值非 0),此时循环结束,脚本会继续执行done之后的代码。
简单示例
下面是一个简单的示例,用于计算从 1 加到 10 的和:

sum=0
i=1
while [ $i -le 10 ]
do
    sum=$((sum + i))
    i=$((i + 1))
done
echo "从1加到10的和为: $sum"

解释:
首先,初始化两个变量sum=0和i=1,sum用于存储累加的结果,i作为计数器。
然后进入while循环,条件是[ $i -le 10 ],即检查i是否小于等于 10。因为初始i = 1,满足条件,所以执行循环体。
在循环体中,sum=$((sum + i))将当前i的值累加到sum中,i=$((i + 1))将i的值加 1。
第一次循环结束后,sum的值变为 1,i的值变为 2。再次检查条件,仍然满足,继续执行循环体。这样一直循环,直到i的值变为 11,此时条件不满足,循环结束。最后通过echo命令输出累加的结果。

实例

for循环实例1反引号 

for i in `seq 1 100`
do
        echo $i
done

代码详细解释
for i in seq 1 100``:这是for循环的起始部分。
seq 1 100是一个 Shell 命令,它的作用是生成一个从 1 到 100 的整数序列,每个整数之间用空格分隔。
反引号()在这里用于命令替换,即将seq 1 100这个命令的输出结果(也就是生成的整数序列)替换到for i in...这个语句中。然后for循环会将这个整数序列中的每个整数依次赋值给变量i`。
do:标志着循环体的开始,在do和与之匹配的done之间的代码就是每次循环要执行的操作。
echo $i:这是循环体内部的代码。它使用echo命令来输出变量i的值,由于在每次循环中i会被赋值为从seq 1 100得到的整数序列中的不同整数,所以这里会依次输出从 1 到 100 的每个整数。
done:标志着for循环体的结束,当循环遍历完从seq 1 100生成的所有整数后,程序就会继续执行done之后的代码(如果有的话)。

for循环实例2$()

for i in $(seq 1 100)
do
        echo $i
done

功能概述
这段 Shell 脚本利用for循环结构结合seq命令,实现了对从 1 到 100 的整数依次进行遍历,并将每个整数输出显示的功能。
代码解析
for i in $(seq 1 100)部分:
$(seq 1 100):这里使用了命令替换的语法$( )。seq是 Shell 中的一个实用命令,用于生成指定范围内的整数序列。在这个例子中,seq 1 100会生成一个从 1 到 100 的整数序列,各个整数之间以空格作为分隔符。然后,通过$( )进行命令替换,将seq命令生成的整数序列替换到for循环的表达式中。
for i in...:定义了一个循环变量i,并且让for循环将$(seq 1 100)所生成的整数序列中的每一个整数依次赋值给变量i。
do部分:它标志着循环体的开始。在for循环结构中,do和与之匹配的done之间的代码段就是每次循环要执行的具体操作内容。
echo $i部分:这是循环体内部的核心代码。echo是 Shell 中用于输出信息的命令,在这里,它会输出变量i的值。由于在每次循环时,变量i都会被赋值为$(seq 1 100)所生成的整数序列中的不同整数,所以每次循环都会输出一个不同的整数,从 1 开始,依次递增,直到 100。
done部分:它标志着for循环体的结束。当for循环完成了对$(seq 1 100)生成的所有整数的遍历操作,即对每个整数都执行了一次循环体中的操作后,程序就会继续执行done之后的代码(如果存在的话)。

seq命令

seq命令用于生成数字序列。它是一个简单而实用的命令行工具,在 Shell 脚本编写和命令行操作中经常用于需要连续数字序列的场景,比如循环计数、生成文件编号序列等。
语法格式
基本语法为seq [选项] 起始值 增量值 结束值或seq [选项] 起始值 结束值。
其中,“起始值” 是序列开始的数字,“增量值” 是序列中相邻两个数字之间的差值(如果省略,默认为 1),“结束值” 是序列结束的数字。

for循环实例3双括号

for ((i=1; i<10;i++))

do

                echo $i

done

代码结构与功能
这段代码使用了 Shell 中的一种for循环语法格式,用于实现从 1 到 9 的数字依次输出的功能。
具体分析
for ((i=1; i<10; i++))部分:
这是for循环的控制表达式部分,使用了双括号(( ))的语法形式。
i=1是初始化操作,它定义并初始化了循环变量i的值为 1。
i<10是条件判断部分,在每次循环开始前,都会检查循环变量i的值是否小于 10。只要这个条件满足,循环就会继续执行。
i++是迭代操作,在每次循环体执行完毕后,会对循环变量i进行自增操作,即将其值增加 1。
do部分:
它标志着循环体的开始。在for循环结构中,do和与之匹配的done之间的代码就是每次循环要执行的具体操作内容。
echo $i部分:
这是循环体内部的代码。echo是 Shell 中用于输出信息的命令,在这里它会输出变量i的值。由于在每次循环时,变量i的值会根据循环的迭代操作不断变化,所以每次循环都会输出一个不同的数字,从 1 开始,依次递增,直到 9(因为当i的值达到 10 时,条件i<10不满足,循环就会停止)。
done部分:
它标志着for循环体的结束。当for循环完成了对满足条件的所有数字的遍历操作,即对每个符合条件的数字都执行了一次循环体中的操作后,程序就会继续执行done之后的代码(如果存在的话)。

while循环实例1双括号

i=1 
while(( $i<=10 )) 
do 
        echo $i 
        ((i++)) 
done

功能概述
这段 Shell 脚本利用while循环结构实现了从 1 到 10 的整数依次输出的功能。通过不断地检查循环条件并更新循环变量的值,在满足条件的情况下重复执行循环体内的输出操作。
代码解析
i = 1部分:
这是对变量i进行初始化的操作,将变量i的值初始化为 1,为后续的循环操作提供初始值。
while(( $i <= 10 ))部分:
这是while循环的条件判断部分。使用双括号(( ))进行条件判断,在这里主要用于算术运算相关的条件判断。
$i <= 10是具体的条件表达式,它会检查变量i的值是否小于等于 10。只要这个条件为真(即变量i的值满足小于等于 10 的要求),while循环就会继续执行循环体中的代码。
do部分:
它标志着循环体的开始。在while循环结构中,do和与之匹配的done之间的代码段就是每次循环要执行的具体操作内容。
echo $i部分:
这是循环体内部的代码。echo是 Shell 中用于输出信息的命令,在这里它会输出变量i的值。由于在每次循环时,变量i的值会根据循环的执行情况发生变化,所以每次循环都会输出一个不同的整数,从 1 开始,依次递增,直到满足循环条件的最大整数(在这里是 10)。
((i++))部分:
这是在循环体内部对循环变量i进行更新的操作。使用双括号(( ))进行算术运算,i++表示将变量i的值自增 1。在每次循环体执行完echo $i操作后,就会执行这个操作来更新变量i的值,以便下一次循环时进行新的条件判断和输出操作。
done部分:
它标志着while循环体的结束。当while循环完成了对满足条件的所有整数的遍历操作,即对每个符合条件的整数都执行了一次循环体中的操作后,程序就会继续执行done之后的代码(如果存在的话)。

while循环实例2 双引号和let

i=1 
while(( $i<=10 )) 
do 
        echo $i 
       let "i++"
done

功能说明
这段 Shell 脚本通过while循环实现了从 1 到 10 的整数依次输出的功能。在循环过程中,不断判断循环条件是否满足,并更新循环变量的值以控制循环的执行次数。
代码解析
i = 1:
这一步是对变量i进行初始化,将其值设定为 1,为后续的循环操作提供起始值。
while(( $i <= 10 )):
这里是while循环的条件判断部分。使用双括号(( ))来进行条件的判断,主要用于处理算术运算相关的条件。
具体的条件表达式是$i <= 10,它会检查变量i的当前值是否小于等于 10。只要这个条件成立(即变量i的值满足小于等于 10 的要求),while循环就会继续执行循环体中的代码。
do:
标志着循环体的开始。在while循环结构中,do和与之匹配的done之间的代码就是每次循环要执行的具体操作内容。
echo $i:
这是循环体内部的代码。echo是 Shell 中用于输出信息的命令,在这里它会输出变量i的当前值。由于在每次循环时,变量i的值会根据循环的执行情况而改变,所以每次循环都会输出一个不同的整数,从 1 开始,依次递增,直到满足循环条件的最大整数(也就是 10)。
let "i++":
let是 Shell 中的一个命令,用于执行算术运算。在这里,let "i++"的作用是将变量i的值自增 1。在每次循环体执行完echo $i操作之后,就会执行let "i++"来更新变量i的值,以便下一次循环时进行新的条件判断和输出操作。
done:标志着while循环体的结束。当while循环完成了对满足条件的所有整数的遍历操作,即对每个符合条件的整数都执行了一次循环体中的操作后,程序就会继续执行done之后的代码(如果存在的话)


http://www.kler.cn/a/419174.html

相关文章:

  • 【人工智能基础03】机器学习(练习题)
  • React 自定义钩子:useOnlineStatus
  • 爬虫框架快速入门——Scrapy
  • Scala—列表(可变ListBuffer、不可变List)用法详解
  • 基于Java Springboot学生信息管理系统
  • uniapp连接mqtt频繁断开原因和解决方法
  • Linux下的三种 IO 复用
  • 文件比较和文件流
  • 大数据治理的介绍与认识
  • LeetCode题解:30.串联所有单词的子串【Python题解超详细,KMP搜索、滑动窗口法】,知识拓展:Python中的排列组合
  • 贝叶斯统计:高斯分布均值μ的后验分布推导
  • 详解QtPDF之 QPdfLink
  • 基于PHP的物流配送管理信息系统的设计与实现
  • 【redis】如何跑
  • flink学习(12)——checkPoint
  • 【Maven】依赖冲突如何解决?
  • 【链表】力扣 2. 两数相加
  • 基于yolov8、yolov5的吸烟行为检测识别系统(含UI界面、训练好的模型、Python代码、数据集)
  • 如何在 VPS 上使用 Git 设置自动部署
  • linux cenos redis 单机部署
  • 【Linux】磁盘 | 文件系统 | inode
  • 图解人工智能:从规则到深度学习的全景解析
  • LabVIEW将TXT文本转换为CSV格式(多行多列)
  • digit_eye开发记录(3): C语言读取MNIST数据集
  • EtherCAT转DeviceNe台达MH2与欧姆龙CJ1W-DRM21通讯案例
  • grpc与rpcx的区别