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),防止和系统命令或其它库冲突










