提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本教程将系统讲解这三大特性:case 语句专为多条件匹配设计,能优雅替代繁琐的 if-elif-else 链;函数则允许将重复逻辑封装成独立模块,提升代码复用性与可读性;数组作为数据结构,可高效存储和处理批量数据。通过本教程,你将掌握这些特性的核心用法与实践技巧,编写更专业、健壮的 Shell 脚本。

一、case

1.1case概述

case 语句是编程中常用的一种多分支选择结构,其基本语法格式如下:

case $变量名称 in
匹配模式1)
	程序段
;; # 匹配模式1执行完毕

匹配模式2)
	程序段
;;

*) # 默认值,没有匹配的模式
	程序段
;;
esac # 代表case语句结束


1.2案例

案例1
在这里插入图片描述

在这里插入图片描述

案例2
在这里插入图片描述

在这里插入图片描述

二、函数

2.1 函数的定义与调用

函数是封装特定功能的代码块。例如:print()函数用于输出内容。

使用函数的好处在于,当需要解决某个问题时,程序员可以直接调用已有函数,无需重复编写代码。

函数的划分:内置函数、自定义函数 内置函数:编程语言自身自带的函数。 例:shell语言中自带函数、 awk语言自带函数(print)
自定义函数: 程序员自已编写的函数。 | – 函数的定义(如何编写一个函数) | – 函数的使用(如何调用编写好的函数)

---
function 函数名字 ()
{
	程序段;
	[return int;]
}

1、可以带 function fun() 定义,也可以直接 fun() 定义, 不带任何参数。
2、参数返回,可以显式加 return ,如果不加,将以最后一条命令运行结果,作为返回值

2.1 函数的参数

在 Shell 中,调用函数时可以向其传递参数。在函数体内部, 通过 $n 的形式来获取参数的值,例如, $1 表示第一个参数, $2 表示第二个参数…

注意, 当 n>=10 时,需要使用${n} 来获取参数。

2.1.1 案例1:带参数的函数

在这里插入图片描述

在这里插入图片描述

2.1.2案例2:定义函数:接收两个数据

在这里插入图片描述
在这里插入图片描述

2.1.3案例3:编写函数计算两个数的和

在这里插入图片描述

在这里插入图片描述

2.3 函数的返回值

函数的返回值:函数内部在处理完所有问题后,需要有一个结果返回给调用者。

返回值通过 return 返回,调用者通过 $? 获取
在 shell 脚本的函数中,return 命令的主要作用是:

结束当前函数的执行流程,返回到调用该函数的地方
返回一个状态码(退出状态)给调用者,用于表示函数执行的结果状态
关于 return 能返回的最大值:

在 shell 中,return 只能返回 0-255 之间的整数
这是因为 shell 采用 8 位无符号整数来表示退出状态
如果返回值超过 255,会进行模 256 运算处理(例如 return 256 实际相当于 return 0,return 257 相当于 return 1)
通常的约定是:

return 0 表示函数执行成功
return 非 0 值表示函数执行失败,不同的非 0 值可以代表不同的错误类型

在这里插入图片描述
在这里插入图片描述

案例:有返回值的函数

在这里插入图片描述
这行代码的作用是计算 $1 + $2 的结果,然后将这个结果作为函数的退出状态码返回。
在这里插入图片描述

2.4其他案例

案例一
测试文件是否存在

在这里插入图片描述
-f $file ] 是一个测试表达式,用于检查 $file 变量所指向的路径是否为一个普通文件(-f 是 “file” 的缩写)。
在这里插入图片描述
案例二

函数的递归

在这里插入图片描述

list(){
for i in $1/* # 遍历第一个参数(目录路径)下的所有内容(文件/子目录)
do
if [ -d KaTeX parse error: Expected 'EOF', got '#' at position 12: i ]; then #̲ 判断当前遍历的对象是否为目录…i\e[0m" # 若是目录,蓝色高亮输出目录路径(\e[0m 恢复默认颜色)
list $i " $2" # 递归调用自身:将当前目录作为新的遍历目标,缩进增加一层(原缩进 $2 前加空格)
else
echo “ 2 2 2i” # 若是文件,按当前层级缩进输出文件路径
fi
done

三、数组

数组可以理解为是一个用来存放多个值的容器。

数组中存储的数据,通常可以称为:元素。

当数组中存储了多个元素后,就会给每一个元素添加一个编号(索引),从0开始。

3.1 数组的定义

数组的定义
数组是存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用
Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下

array_name=(value1 value2 value3 ... valueN)
#!/bin/bash
my_array=(A B "C" D)

3.2 读取数组

读取数组元素值的一般格式是:${array_name[index]}
index 是指数组的索引,从0开始

#!/bin/bash
my_array=(A B "C" D)
echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"
其他定义与访问
arr=("A" "B" "C")
echo ${arr[0]} # 输出:A
echo ${arr[@]} # 输出所有元素
echo ${#arr[@]} # 输出数组长度

执行脚本输出结果

[root@benet21 ~]# ./1.sh
第一个元素为: A
第二个元素为: B
第三个元素为: C
第四个元素为: D

3.3遍历数组

遍历:把数组中存储的元素依次取出
要使用:循环
回顾for循环的知识点:

#第一种方式
for((i=0;i<上限值;i++))
do
程序.... done
#第二种方式
for 变量名 in 数据1 数据2 数据3
do
程序.....
done
for i in ${arr[@]}; do
echo $i
done

总结

case 语句、函数与数组的核心价值在于 “提升代码效率与可维护性”:case 语句简化多条件判断,函数实现逻辑复用,数组优化批量数据处理。掌握这些特性后,你可以编写出结构清晰、功能强大的 Shell 脚本,从容应对复杂的自动化任务。

更多推荐