4.1 函数与参数传递

4.1 函数与参数传递

一、函数基础

函数用于封装可重复执行的代码块,能够提高 Shell 脚本的可维护性与复用性。在大型运维脚本中,函数通常用于拆分业务逻辑,实现模块化管理。

Shell 函数基本语法:

1
2
3
function_name() {
command
}

调用函数:

1
function_name

示例:

1
2
3
4
5
6
7
#!/bin/bash

hello() {
echo "hello shell"
}

hello

二、函数定义规则

Shell 从上到下解析脚本,因此函数必须先定义再调用。

错误示例:

1
2
3
4
5
test

test() {
echo hello
}

正确示例:

1
2
3
4
5
test() {
echo hello
}

test

三、函数参数

函数支持位置参数,与脚本参数用法一致。

基本参数

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

show_user root

输出:

1
用户: root

多参数处理

1
2
3
4
5
6
7
8
9
10
11
show_args() {

echo "参数个数: $#"

for arg in "$@"
do
echo "$arg"
done
}

show_args aaa bbb ccc

常用参数变量:

参数 含义
$1 第一个参数
$2 第二个参数
$# 参数数量
$@ 全部参数

四、return 与退出状态码

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

范围:

1
0-255

约定:

  • 0 表示成功
  • 0 表示失败

示例:

1
2
3
4
5
6
7
8
check() {

return 0
}

check

echo $?

输出:

1
0

五、函数返回数据

Shell 通常通过 echo 输出结果,再使用命令替换获取。

示例:

1
2
3
4
5
6
7
8
get_time() {

echo "$(date)"
}

now=$(get_time)

echo "$now"

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


六、局部变量与全局变量

默认情况下,Shell 变量属于全局变量。

示例:

1
2
3
4
5
6
7
8
9
10
name=global

test() {

name=local
}

test

echo "$name"

输出:

1
local

函数内部修改了全局变量。


local 局部变量

推荐在函数内部使用 local 限制变量作用域。

1
2
3
4
5
6
test() {

local name=local

echo "$name"
}

局部变量仅在函数内部有效,可避免大型脚本中的变量污染问题。


七、模块化脚本结构

复杂脚本应按功能拆分为多个函数,而不是将所有命令堆叠在一起。

示例:

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

check_user() {

if [ "$USER" = "root" ]
then
echo "root 用户"

else
echo "普通用户"
fi
}

show_time() {

date
}

main() {

check_user

show_time
}

main

这种结构更适合维护和扩展。


八、exit 与 return 的区别

return

用于结束函数执行。

1
return 0

exit

用于结束整个脚本。

1
exit 1

示例:

1
2
3
4
5
6
7
8
9
10
test() {

echo hello

exit 1
}

test

echo world

脚本会在 exit 后直接终止。


九、source 加载公共函数

Shell 支持加载外部脚本,实现函数复用。

公共函数文件

1
2
3
4
5
6
# functions.sh

hello() {

echo hello
}

主脚本

1
2
3
4
5
#!/bin/bash

source functions.sh

hello

等价写法:

1
. functions.sh

这种方式常用于运维脚本公共函数库。


十、批量设备检测示例

下面是一个典型的 Shell 运维脚本结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash

check_device() {

local ip=$1

ping -c 1 "$ip" > /dev/null 2>&1

if [ $? -eq 0 ]
then
echo "$ip 在线"

else
echo "$ip 离线"
fi
}

main() {

devices=(
192.168.1.1
192.168.1.2
)

for ip in "${devices[@]}"
do
check_device "$ip"
done
}

main

该脚本综合使用了:

  • 函数
  • 参数传递
  • local 变量
  • 数组
  • for 循环
  • if 判断
  • 状态码 $?

这是实际 Linux 运维自动化脚本中的常见结构。


十一、main 函数规范

工程化 Shell 脚本通常采用 main() 作为程序入口。

示例:

1
2
3
4
5
6
7
8
9
10
main() {

init_config

check_env

start_service
}

main

优点:

  • 结构清晰
  • 易于维护
  • 易于扩展
  • 接近标准编程语言设计

十二、总结

函数是 Shell 脚本模块化开发的重要基础。掌握函数后,可以将复杂脚本拆分为独立功能模块,提高代码复用率与可维护性。

核心内容包括:

  • 函数定义与调用
  • 参数传递
  • return 与 exit
  • 局部变量
  • source 模块加载
  • main 函数结构
  • 运维自动化脚本组织方式

4.1 函数与参数传递
https://blog.sh462li.top/2026/06/05/Shell_learn/4.1 函数与参数传递/
作者
SHAO
发布于
2026年6月5日
许可协议