Shell工程化:参数化脚本指南

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

Shell工程化:参数化脚本指南

一、为什么要使用参数化脚本

传统开发中,通常会为不同功能编写多个脚本,例如:

1
2
3
install.sh
start.sh
stop.sh

这种方式容易导致大量重复代码,如日志、配置加载和错误处理等。

工程化推荐采用一个脚本负责多个功能

1
2
3
4
./tool.sh install
./tool.sh remove
./tool.sh restart
./tool.sh status

这样既降低维护成本,又方便后续扩展。


二、Shell 参数变量

执行脚本时,Shell 会自动保存命令行参数。

变量 说明
$0 当前脚本名称
$1~$9 第 1~9 个参数
$# 参数数量
$@ 所有参数(推荐)
$* 所有参数(作为一个整体)

示例:

1
./test.sh hello world
1
2
3
4
echo "$0"
echo "$1"
echo "$2"
echo "$#"

输出:

1
2
3
4
./test.sh
hello
world
2

三、$@$* 的区别

遍历参数时推荐使用 "$@"

1
2
3
for arg in "$@"; do
echo "$arg"
done

执行:

1
./test.sh "hello world" linux

输出:

1
2
hello world
linux

"$*" 会将所有参数视为一个整体,一般不适用于参数遍历。


四、使用 case 实现命令分发

对于多个功能入口,不建议使用大量 if...elif...,推荐使用 case

1
2
3
4
5
6
7
8
9
10
11
12
13
14
case "$1" in
install)
echo "安装"
;;
remove)
echo "卸载"
;;
restart)
echo "重启"
;;
*)
echo "未知命令"
;;
esac

case 结构清晰,可扩展性更强,是工程化脚本的常用方案。


五、标准工程结构

建议将每个功能封装为独立函数,由 main() 统一调度:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
install() { }

remove() { }

restart() { }

main() {
case "$1" in
install) install ;;
remove) remove ;;
restart) restart ;;
*) usage ;;
esac
}

main "$@"

其中 main "$@" 可完整保留所有命令行参数,属于推荐写法。


六、帮助信息与参数校验

建议为脚本提供统一帮助信息:

1
2
3
4
5
6
7
8
usage() {
cat <<EOF
Usage:
$0 install
$0 remove
$0 restart
EOF
}

并检查参数是否合法:

1
2
3
4
[ $# -eq 0 ] && {
usage
exit 1
}

这样可以提升脚本的易用性和健壮性。


七、多参数处理

除了命令本身,还可以接收业务参数:

1
./tool.sh install nginx
1
2
3
4
5
install() {
echo "安装:$1"
}

install "$2"

这种方式适用于安装软件、部署服务等场景。


八、getopts 参数解析

对于 -u-h 等命令行选项,可使用 getopts

1
2
3
4
5
6
while getopts "u:h:" opt; do
case $opt in
u) USER=$OPTARG ;;
h) HOST=$OPTARG ;;
esac
done

适用于需要解析多个命令选项的工程脚本。


九、推荐的工程化设计

建议将命令分发独立封装,而不是全部写在 main() 中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dispatch_command() {
case "$1" in
install) install ;;
remove) remove ;;
restart) restart ;;
*) usage; exit 1 ;;
esac
}

main() {
load_config
dispatch_command "$1"
}

main "$@"

这种设计遵循”流程控制与业务逻辑分离”原则,便于维护和功能扩展,也是生产环境 Shell 工程化脚本的常见实现方式。


Shell工程化:参数化脚本指南
http://example.com/f2e2e63b.html
作者
SHAO
发布于
2026年7月9日
许可协议