泷羽sec- shell编程(8) until循环以及函数基本创建调用 学习笔记
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[B站泷羽sec](泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频)
本章课程链接:shell编程(8) until循环以及函数基本创建调用_哔哩哔哩_bilibili
until循环
基本概念
在 Shell 脚本中,until循环是一种与while循环相对应的控制流结构。while循环是在条件为真时执行循环体,而until循环则是在条件为假时执行循环体,直到条件变为真时才停止循环。
语法结构
基本语法如下:
until [ 条件表达式 ]
do
循环体(要执行的命令或代码块)
done
其中,[ 条件表达式 ]部分用于判断循环是否结束。这个表达式和while循环中的条件表达式类似,可以使用比较运算符(如-eq(等于)、-ne(不等于)、-gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于))来比较数值,也可以使用字符串比较运算符(如=、!=)来比较字符串,还可以包含文件测试运算符(如-e(存在)、-f(普通文件)、-d(目录)等)。do和done之间的部分就是循环体,这里面放置的是每次循环需要执行的命令。
执行流程
当脚本执行到until循环时,首先会对[ 条件表达式 ]进行计算。如果条件表达式的计算结果为假(在 Shell 脚本中,通常返回值为非 0 表示假),那么就会执行do和done之间的循环体代码。在循环体执行完毕后,会再次对[ 条件表达式 ]进行计算,只要结果仍然为假,就会再次执行循环体,如此反复,直到[ 条件表达式 ]的计算结果为真(返回值为 0),此时循环结束,脚本会继续执行done之后的代码。
简单示例
下面是一个简单的示例,用于计算从 1 加到 10 的和:
sum=0
i=1
until [ $i -gt 10 ]
do
sum=$((sum + i))
i=$((i + 1))
done
echo "从1加到10的和为: $sum"
首先,初始化两个变量sum = 0和i = 1,sum用于存储累加的结果,i作为计数器。
然后进入until循环,条件是[ $i -gt 10 ],即检查i是否大于 10。由于初始i = 1,条件为假,所以执行循环体。
在循环体中,sum=$((sum + i))将当前i的值累加到sum中,i=$((i + 1))将i的值加 1。
第一次循环结束后,sum的值变为 1,i的值变为 2。再次检查条件,仍然为假,继续执行循环体。这样一直循环,直到i的值变为 11,此时条件为真,循环结束。最后通过echo命令输出累加的结果。
函数
基本概念
Shell 函数是一组可以重复使用的命令集合,将一些相关的操作封装在一起,类似于其他编程语言中的函数。它可以提高代码的复用性和可维护性,使脚本的逻辑结构更加清晰。
实例
until循环1
i=0
until [ ! $i -lt 10 ]
do
echo $i
((i++))
done
功能概述
这段 Shell 脚本利用until循环结构实现了从 0 到 9 的整数依次输出的功能。它通过不断地检查循环终止条件,并在条件未满足时执行循环体内的操作来实现计数输出。
代码解析
i = 0部分:
这是对变量i进行初始化的操作,将变量i的值初始化为 0,为后续的循环操作提供起始值。
until [! $i -lt 10 ]部分:
这是until循环的条件判断部分。
在 Shell 中,[ ](也可写成test)用于条件判断。这里的条件表达式是! $i -lt 10,其中:
$i -lt 10是检查变量i的值是否小于 10。正常情况下,until循环是在条件为假时执行循环体,这里通过在前面加!(逻辑非运算符)进行了反转,即当$i -lt 10这个条件不成立(也就是i的值大于等于 10)时,循环才会停止;而当$i -lt 10成立(即i的值小于 10)时,循环会继续执行。
do部分:
它标志着循环体的开始。在until循环结构中,do和与之匹配的done之间的代码段就是每次循环要执行的具体操作内容。
echo $i部分:
这是循环体内部的代码。echo是 Shell 中用于输出信息的命令,在这里它会输出变量i的值。由于在每次循环时,变量i的值会根据循环的执行情况而改变,所以每次循环都会输出一个不同的整数,从 0 开始,依次递增,直到满足循环终止条件(即i的值达到 10)。
((i++))部分:
这是在循环体内部对循环变量i进行更新的操作。使用双括号(( ))进行算术运算,i++表示将变量i的值自增 1。在每次循环体执行完echo $i操作之后,就会执行((i++))来更新变量i的值,以便下一次循环时进行新的条件判断和输出操作。
done部分:
它标志着until循环体的结束。当until循环完成了对满足循环终止条件之前的所有整数的遍历操作,即对每个符合条件的整数都执行了一次循环体中的操作后,程序就会继续执行done之后的代码(如果存在的话)。
case语句
read -p "请输入一个数值:" num
case $num in
1)echo 你输入的数字是1
;;
2)echo 你输入的数字是2
;;
*)echo 你输入的是:其他的内容
;;
esac
整体流程
首先通过read -p "请输入一个数值:" num这行命令,提示用户在终端输入一个数值,用户输入完成后按回车键,输入的内容就会被存储到num变量中。
然后进入case语句进行判断:
如果num的值等于1,就会执行1)后面的代码,也就是输出你输入的数字是1。
如果num的值等于2,则执行2)后面的代码,输出你输入的数字是2。
如果num的值既不是1也不是2,就会执行*)后面的代码,输出你输入的是:其他的内容。
函数1基本
DemoFunc() {
echo "hello world"
}
DemoFunc
代码功能
这段 Shell 脚本代码定义了一个名为DemoFunc的函数,然后调用了这个函数。函数的功能是在被调用时输出字符串"hello world"。
详细解释
函数定义部分:
DemoFunc() {:这是函数定义的开头部分,声明了一个名为DemoFunc的函数,后面跟着一对花括号{},花括号内的内容就是函数体,定义了函数被调用时要执行的具体操作。
echo "hello world":这是函数体内部的唯一一行代码,当函数DemoFunc被调用时,就会执行这行代码,通过echo命令输出字符串"hello world"。
函数调用部分:
DemoFunc:这是对前面定义的DemoFunc函数进行调用的语句。当执行到这一行时,就会跳转到DemoFunc函数的定义处,执行函数体内部的代码,也就是输出"hello world"。
函数2传递参数
DemoFunc() {
echo "hello world"
echo "My name is $1"
}
DemoFunc Darker
代码功能与执行逻辑
这段 Shell 脚本代码定义了一个名为DemoFunc的函数,然后调用了这个函数并传递了一个参数。函数的主要功能是输出一些固定的字符串以及传入的参数对应的信息。
具体解释
函数定义部分:
DemoFunc() {:这是函数定义的起始部分,声明了一个名为DemoFunc的函数,后面紧跟着一对花括号{},花括号内的内容构成了函数体,也就是函数被调用时要执行的具体操作。
echo "hello world":在函数体中,这是第一条输出语句。当函数DemoFunc被调用时,无论是否传入参数,都会首先执行这行代码,通过echo命令输出字符串"hello world"。
echo "My name is $1":这是函数体中的第二条输出语句。在 Shell 函数中,$1用于指代传入函数的第一个参数。所以当函数DemoFunc被调用并传入参数时,这行代码会输出传入的第一个参数相关的信息,格式为My name is加上传入的第一个参数的值。
函数调用部分:
DemoFunc Darker:这是对前面定义的DemoFunc函数进行调用的语句,并且传入了一个参数Darker。当执行到这一行时,程序会跳转到DemoFunc函数的定义处,按照函数体内部的代码逻辑依次执行。首先会输出"hello world",然后由于传入了参数Darker,$1就获取到了这个值,接着会输出My name is Darker。
函数3多函数调用
DemoFunc(){
echo "hello world"
echo "my name is $1,and is $2 years old"
}
DemoFunc xiaoyu 27
代码功能与执行逻辑
这段 Shell 脚本代码定义了一个名为DemoFunc的函数,然后调用该函数并传递了两个参数。函数的主要功能是输出一些固定的字符串以及传入的两个参数对应的信息。
具体解释
函数定义部分:
DemoFunc() {:这是函数定义的起始部分,声明了一个名为DemoFunc的函数,其后跟着一对花括号{},花括号内的内容构成函数体,即函数被调用时要执行的具体操作。
echo "hello world":在函数体中,这是第一条输出语句。无论是否传入参数,当函数DemoFunc被调用时,都会首先执行这行代码,通过echo命令输出字符串"hello world"。
echo "my name is $1,and is $2 years old":这是函数体中的第二条输出语句。在 Shell 函数中,$1用于指代传入函数的第一个参数,$2用于指代传入函数的第二个参数。所以当函数DemoFunc被调用并传入参数时,这行代码会根据传入的参数值输出相应信息,格式为 “我的名字是传入的第一个参数值,并且是传入的第二个参数年龄”。
函数调用部分:
DemoFunc xiaoyu 27:这是对前面定义的DemoFunc函数进行调用的语句,同时传入了两个参数,第一个参数是xiaoyu,第二个参数是27。当执行到这一行时,程序会跳转到DemoFunc函数的定义处,按照函数体内部的代码逻辑依次执行。首先会输出"hello world",然后由于传入了参数xiaoyu作为第一个参数,27作为第二个参数,所以接着会输出my name is xiaoyu,and is 27 years old。