1. Shell函数基础概念
在Shell脚本编程中,函数是将一组命令封装成可重复调用的代码块的有效方式。就像建筑工地上的预制件,函数让我们可以提前制作好标准组件,在需要时直接调用,而不必每次都从头搭建。
函数的基本语法有两种形式:
bash复制# 形式一:使用function关键字
function 函数名 {
命令序列
}
# 形式二:类C语言风格
函数名() {
命令序列
}
这两种形式在功能上完全等效,第一种更显式地表明了函数定义,第二种则更为简洁。在实际项目中,我倾向于使用第一种形式,因为当脚本复杂时,"function"关键字能让代码结构更清晰。
注意:函数名后面的大括号必须与函数名在同一行或者用换行符分隔,否则会报语法错误。这是Shell语法的一个特殊要求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 函数参数与返回值处理
2.1 参数传递机制
Shell函数的参数传递方式与脚本参数传递非常相似,但有一个关键区别:函数参数是在调用时传递的,而不是在定义时声明。这就像你去餐厅点餐,菜单(函数定义)上不会写明你要吃什么,只有当你实际下单(调用函数)时才会确定具体菜品(参数)。
bash复制function greet {
echo "Hello, $1! Today is $2."
}
greet "Alice" "Monday"
在这个例子中,$1和$2分别代表第一个和第二个参数。需要注意的是:
- 参数从1开始编号($1, $2,...),$0仍然是脚本名称
- 超过9个参数时需要用大括号:$
- 特殊参数$#表示参数个数,$@表示所有参数列表
2.2 返回值处理
Shell函数通过三种方式"返回"值:
-
退出状态码:默认情况下,函数返回最后一条命令的退出状态码(0表示成功)
bash复制function is_file { [ -f "$1" ] } is_file "example.txt" && echo "File exists" -
全局变量:通过修改全局变量来传递结果
bash复制result="" function get_date { r
