Shell函数化与脚本工程化

本文最后更新于 2026年7月7日 下午

Shell函数化与脚本工程化

一、为什么使用函数

当 Shell 脚本规模逐渐增大时,直接顺序编写代码会导致重复代码增多、维护困难、可读性降低。

函数的作用是将一段可重复使用的逻辑封装起来,通过调用实现代码复用,提高脚本的模块化程度。

二、定义与调用函数

Shell 常见函数定义方式如下:

1
2
3
hello() {
echo "Hello World"
}

调用函数:

1
hello

虽然 Shell 也支持 function hello(){} 的写法,但推荐采用 POSIX 风格,具有更好的兼容性。

需要注意的是,Shell 按顺序解释执行,因此函数必须先定义,再调用

三、函数调用关系

函数之间可以相互调用,从而实现模块拆分。

例如:

1
2
3
4
5
6
7
8
9
install() {
echo "安装完成"
}

main() {
install
}

main

大型脚本通常由多个功能函数组成,再统一由 main() 负责调度执行,使整体结构更加清晰。

四、函数参数

函数支持位置参数,与脚本参数使用方式一致。

1
2
3
4
5
show_user() {
echo "当前用户:$1"
}

show_user SHAO

多个参数:

1
2
3
4
5
6
show() {
echo "$1"
echo "$2"
}

show apple banana

获取全部参数:

1
2
3
show() {
echo "$@"
}

其中:

参数 说明
$1 第一个参数
$2 第二个参数
$@ 所有参数
$# 参数数量

五、函数返回值

Shell 中 return 返回的是退出状态码,而不是字符串。

1
2
3
4
5
6
check_root() {
if [ "$EUID" -ne 0 ]; then
return 1
fi
return 0
}

约定:

  • 0:执行成功
  • 0:执行失败

若需要返回字符串或数据,应通过标准输出配合命令替换实现:

1
2
3
4
5
6
get_name() {
echo "SHAO"
}

name=$(get_name)
echo "$name"

这是 Shell 中获取函数结果的标准方式。

六、main 函数思想

虽然 Shell 不强制要求 main(),但工程化脚本通常采用统一入口。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
check_root() {
echo "检查权限"
}

install() {
echo "安装软件"
}

main() {
check_root
install
}

main

这种结构便于阅读、调试和后期扩展,也是多数自动化脚本采用的组织方式。

七、推荐脚本结构

建议按照以下模板组织 Shell 项目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

# 全局变量
APP_NAME="demo"

# 函数定义
check_root() {

}

install() {

}

main() {
check_root
install
}

main

推荐遵循以下原则:

  • 全局变量统一放置在文件开头。
  • 每个函数只负责一个功能。
  • 函数命名应体现具体职责。
  • 所有业务流程统一由 main() 调度。
  • 公共功能可拆分为独立脚本,通过 source 引入,提高复用性。

采用函数化与模块化设计,可以显著提升 Shell 脚本的可维护性、可读性和工程实践能力,也是自动化运维脚本开发的重要基础。


Shell函数化与脚本工程化
http://example.com/60b0ef4b.html
作者
SHAO
发布于
2026年7月7日
许可协议