声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章
感谢泷羽sec 团队的教学
视频地址:shell编程(8) until循环以及函数基本创建调用_哔哩哔哩_bilibili
一、until循环结构
在Shell编程中,until
循环是一种常见的循环结构,它与 while
循环相对。until
循环会重复执行一段代码,直到某个条件为真(即条件表达式的结果为非零)时才停止。这种循环特别适用于在某个条件达成之前需要不断尝试的情况。
1.基本语法
until
循环的基本语法如下:
until [ 条件表达式 ]
do
# 循环体中的命令
done
until
后面跟着一个条件表达式,这个表达式通常是用方括号[ 条件表达式 ]
包围的。do
和done
之间的部分是循环体,包含了在每次循环迭代中需要执行的命令。- 循环会一直执行,直到条件表达式的结果为真(即返回值为0)。
示例
假设我们想要打印出从0到9的数字,可以使用 until
循环来实现:
i=0
until [ $i -gt 9 ]
do
echo $i
i=$((i+1))
done
在这个例子中:
- 初始化变量
i
为0。 until [ $i -gt 9 ]
表示循环将继续执行,直到i
大于9。- 在循环体中,首先打印出
i
的值,然后i=$((i+1))
将i
的值增加1。 - 当
i
增加到10时,条件$i -gt 9
为真,循环停止。
2.until循环结构和while循环结构的区别
在Shell脚本中,until
循环和 while
循环都是用于重复执行一段代码的控制结构,但它们在执行逻辑上是相反的。下面是它们的主要区别:
(1)执行条件
while
循环:在条件为真(即条件表达式的结果为非零)时继续执行循环体。只有当条件为真时,循环体内的命令才会被执行。until
循环:在条件为假(即条件表达式的结果为零)时继续执行循环体。只有当条件为假时,循环体内的命令才会被执行。
(2) 循环结束条件
while
循环:当条件变为假(即条件表达式的结果为零)时,循环结束。until
循环:当条件变为真(即条件表达式的结果为非零)时,循环结束。
(3) 典型用途
while
循环:通常用于在某个条件持续为真的期间内重复执行任务,例如处理文件中的每一行,直到文件结束。until
循环:通常用于在某个条件变为真之前重复执行任务,例如等待某个文件被创建或某个进程结束。
示例
-
while
循环 示例:打印数字从1到5。i=1 while [ $i -le 5 ] do echo $i i=$((i+1)) done
-
until
循环 示例:等待用户输入一个非空字符串。input="" until [ -n "$input" ] do read -p "请输入一个非空字符串:" input done echo "您输入的是:$input"
在实际应用中,选择 while
还是 until
循环取决于你的具体需求和循环的逻辑条件。
二、case语句结构
在Shell编程中,case
语句是一种多分支选择结构,允许你根据变量的值来执行不同的代码块。这种结构在需要对单个变量的多个可能值进行测试并执行相应操作时非常有用。
基本语法
case
语句的基本语法如下:
case 变量名 in
模式1)
# 当变量匹配模式1时执行的命令
;;
模式2)
# 当变量匹配模式2时执行的命令
;;
*)
# 当变量不匹配任何已列出的模式时执行的命令(可选)
;;
esac
case
后面跟着一个变量名,这个变量的值将被用来与后面的模式进行匹配。- 每个模式后面跟着一个右括号
)
,然后是一系列命令,这些命令在变量值与模式匹配时执行。 ;;
用于结束每个模式分支的命令列表。*)
是一个通配符模式,用于匹配所有未被前面模式捕获的值。这可以看作是case
语句的默认分支。esac
结束整个case
语句。
示例
假设你想要根据不同的用户输入执行不同的操作,可以使用case
语句来实现:
read -p "请输入一个数字(1, 2, 3):" num
case $num in
1)
echo "您选择了数字 1"
;;
2)
echo "您选择了数字 2"
;;
3)
echo "您选择了数字 3"
;;
*)
echo "无效的输入,请输入 1, 2 或 3。"
;;
esac
在这个例子中:
- 用户被提示输入一个数字。
case
语句根据用户输入的数字num
来决定执行哪个分支。- 如果用户输入1、2或3,相应的分支将被执行,输出相应的消息。
- 如果用户输入的不是1、2或3,
*)
分支将被执行,输出错误消息。
注意事项
- 在
case
语句中,模式可以是具体的值,也可以是使用通配符的模式。 - 模式匹配是大小写敏感的,可以在比较之前将变量值和模式都转换为同一种大小写(通常是全部转换为小写或大写),通过使用
tr
命令、lowercase
或uppercase
函数来实现。 ;;
是每个分支的结束标记,不能省略。*)
分支是可选的,但通常用于处理未预料到的输入。
三、函数
在Shell脚本中,函数是一种非常有用的功能,它允许你定义可重复使用的代码块。通过使用函数,你可以提高脚本的模块化程度,使得代码更加清晰和易于维护。
函数定义
在Shell中定义函数的基本语法如下:
函数名() {
# 函数体中的命令
}
函数调用
定义函数后,你可以通过简单地调用函数名来执行函数体内的代码:
函数名
参数传递
函数可以接收参数,这些参数在函数体内可以通过特殊参数 $1
, $2
, $3
, ... 来访问,其中 $1
是第一个参数,$2
是第二个参数,依此类推。所有传递给函数的参数可以通过 $@
来访问。
返回值
Shell函数可以通过 return
语句返回一个值,但这个值主要用于 if
, while
, until
等结构中的条件判断。函数的返回值实际上是函数最后一条命令的退出状态,可以通过 $?
来获取。
示例
下面是一个简单的Shell脚本示例,展示了如何定义和使用函数:
#!/bin/bash
# 定义一个函数,用于打印传入的参数
print_message() {
for message in "$@"; do
echo "$message"
done
}
# 调用函数,传入一些消息
print_message "Hello, World!" "This is a test." "Functions are useful."
# 定义一个函数,用于计算两个数的和
add_numbers() {
local num1=$1
local num2=$2
local sum=$(expr $num1 + $num2)
echo $sum
}
# 调用函数,计算两个数的和
result=$(add_numbers 3 5)
echo "The sum is: $result"
在这个示例中:
print_message
函数接受任意数量的参数,并打印每个参数。add_numbers
函数接受两个参数,计算它们的和,并打印结果。
注意事项
- 函数内部定义的变量默认是局部变量,不会影响脚本其他部分。
- 使用
local
关键字可以明确声明局部变量。 - 函数可以提高脚本的可读性和可维护性,但过度使用或不当使用也可能导致脚本难以理解和调试。