linux bash函数封装需先定义后调用,支持嵌套调用但不支持嵌套定义;参数用$1等接收,返回字符串用echo+$(...),状态码用return+$?;变量须用local声明避免污染全局作用域。

Linux 中的函数封装,主要指在 Bash 脚本里定义函数,并通过函数调用实现逻辑复用和结构清晰。在函数中调用另一个函数,就是典型的函数嵌套调用——不是嵌套定义(即不能在一个函数内部再 function xxx(){...}),而是调用已定义好的其他函数。
函数必须先定义、后调用
Shell 不支持“前向声明”,所有被调用的函数必须在调用它的函数之前定义(或至少在执行到调用语句前已加载)。否则会报错 command not found。
- 推荐把所有函数集中写在脚本开头,主逻辑放在最后
- 也可用
source加载外部函数库文件
直接调用:无返回值场景
如果被调函数只做输出或设置变量(不依赖返回值),直接写函数名即可:
# 定义基础函数
log_info() {
echo "[INFO] $1"
}
<p>backup_data() {
log_info "Starting backup..." # 直接调用
cp -r /data /backup/$(date +%Y%m%d)
log_info "Backup completed"
}</p>- 调用时不需要加
(),写log_info "xxx"即可 - 参数通过
$1、$2等接收,和主脚本一致
捕获输出或返回值:带结果传递
若需获取被调函数的输出内容(如生成的路径、计算结果),用命令替换 $(...);若用 return 传状态码(0–255 整数),则用 $? 检查:
# 返回字符串内容(用 echo)
get_version() {
echo "v2.4.1"
}
<h1>返回整数状态(用 return)</h1><p>check_ready() {
[ -f "/tmp/ready.flag" ] && return 0 || return 1
}</p><h1>在另一函数中使用</h1><p>deploy() {
VER=$(get_version) # 捕获 stdout
echo "Deploying $VER"</p><p>check_ready
if [ $? -eq 0 ]; then # 检查 return 值
echo "System ready"
else
echo "Wait for init..."
fi
}</p>-
return只能返回 0–255 的整数,常用于成功/失败判断 -
echo+$(...)才能传递字符串、数字等任意内容 - 避免混用:不要在同一个函数里既
echo又return作同一用途
注意作用域与变量可见性
Bash 函数默认共享全局变量。如需局部变量,必须显式用 local 声明,否则嵌套调用时容易覆盖同名变量:
calc_total() {
local sum=0 # 局部变量,不影响外层
sum=$(( $1 + $2 ))
echo $sum
}
<p>main() {
local a=10 b=20
result=$(calc_total $a $b) # 安全:内部 sum 不污染 main
echo "Total: $result"
}</p>- 未加
local的变量在所有函数中都可视、可改 - 多个函数共用一个变量名但未声明局部,是常见 bug 来源











