函数定义必须前置,推荐集中放在脚本顶部;参数访问超$9需用${10}格式;"$@"安全遍历多参数;复杂场景优先用数组或getopts;local变量防污染。

function 关键字不是必须的,直接用 func_name() 定义更简洁、兼容性更好,尤其在旧版 /bin/sh 或 Alpine 的 ash 下能避免语法错误。
函数定义必须放在调用之前
Shell 解释器是顺序执行的,函数未定义就调用会报错:command not found。这不是运行时错误,而是解析阶段失败。
- 把所有函数集中放在脚本顶部(
#!/bin/bash之后)是最稳妥的做法 - 不能在
if块或循环体内定义函数后立刻调用——即使逻辑上“已定义”,解释器仍可能跳过该分支导致未注册 - 如果函数逻辑复杂需分文件管理,用
source ./lib.sh加载,但lib.sh本身也得先完成全部定义再被 source
$1 到 ${10} 的参数访问规则
位置参数 – 可直接写,但第 10 个及以后必须用 、 等带花括号的形式,否则 会被解释为 后跟字符 0。
-
$#始终返回实际传入的参数个数,可用于做参数校验 -
"$@"是安全遍历多参数的唯一推荐方式:每个参数保持原始空格和引号边界 -
"$*"会把所有参数拼成一个字符串,中间用第一个 IFS 字符(通常是空格)连接,容易破坏含空格的路径或选项 - 示例:
myfunc "a b" "c d"中,"$@"展开为两个独立参数,"$*"展开为"a b c d"
传参超过 10 个时别硬扛 ${n}
当参数数量动态增长(比如批量处理多个服务名、IP、端口),继续用 ${11}、${12} 写法不仅难读,还极易出错且无法扩展。
- 优先转为数组:
local args=("$@"),然后用${args[0]}、${args[1]}访问(注意:Bash 数组下标从 0 开始,而$1对应${args[0]}) - 若需命名语义,改用
getopts或手动解析--host=localhost --port=22类型参数,比数位置可靠得多 - 极端情况(如生成 Redis Sentinel 配置)可把参数预存在配置文件里,函数只负责读取
source config.env,绕过命令行长度限制(getconf ARG_MAX)
local 声明变量时,若未加 local,变量默认全局——多个函数并发调用时会相互污染;而 local 在非函数作用域中无效,误用会导致静默失败。











