Linux Shell 函数用 my_task() { …}或 function my_task {…}定义,推荐前者;参数靠 $1、$2 等位置变量,局部变量需 local 声明;应遵循单一职责、输入明确输出可控、可独立测试原则,并通过 source 复用模块化函数。

Linux Shell 函数通过 function_name() { ……} 或 function function_name {……} 语法定义,核心是把重复逻辑、独立任务封装成可复用单元,让脚本更清晰、易维护、可测试。
函数定义的两种标准写法
Shell 支持两种等效声明方式,推荐使用第一种(更通用、兼容性更好):
- 简洁写法(推荐):
my_task() { echo "done";}—— 无需function关键字,POSIX 和 Bash 都支持 - 显式关键字写法:
function my_task {echo "done";}—— Bash 特有,部分旧版 shell 不识别
注意:函数体用花括号包裹,左括号必须紧跟函数名后(中间不能换行或空格),否则会报错。
参数传递与变量 作用域 要点
Shell 函数不支持命名参数或默认值,全部依赖位置参数 、…… 和特殊变量:
-
$#表示传入参数个数,常用于校验:[[$# -ne 2]] && echo "Usage: $0" && return 1 -
$@完整转发所有参数(保留空格和引号),适合代理调用:cp "$@" /backup/ - 函数内定义的变量默认是全局的;如需局部变量,用
local var=value(仅 Bash/Zsh 支持)
模块化设计的三个实践原则
把脚本拆成“小功能块”,不是为了炫技,而是为降低出错概率和提升协作效率:
- 单一职责 :每个函数只做一件事。例如
check_disk_space只检测并返回 状态码,不负责发邮件或退出脚本 - 输入明确、输出可控:用
return N返回状态码(0= 成功),用echo输出数据(供命令替换捕获),避免混用 - 可独立测试:函数应能脱离主流程单独运行,比如
source script.sh && validate_email "a@b.com"
加载与复用:让函数跨脚本可用
把常用函数抽成独立文件(如 lib.sh),用 source lib.sh 或 . lib.sh 引入:
- 路径建议用绝对路径或基于脚本所在目录动态计算:
source "$(dirname"$0")/lib.sh" - 避免重复加载:可在
lib.sh开头加[["${LIB_SH_LOADED+set}" = "set" ]] && return; LIB_SH_LOADED=1 - 函数名建议加前缀(如
myapp_log、myapp_backup),防止和系统命令或其它库冲突