Shell函数是脚本工程化的起点,需用标准写法function_name() { ... }确保POSIX兼容;调用时直接写函数名加参数,勿加括号;参数通过$1、$@等访问;变量须用local声明避免污染全局作用域。

Shell 函数不是语法糖,而是脚本工程化的起点。它让重复逻辑集中管理、参数驱动行为、变量作用域可控——关键不在“会不会写”,而在“怎么写才可靠”。
函数定义:两种写法,一个原则
标准写法是 函数名() { 命令序列; },不加 function 关键字。这种形式兼容 POSIX,能在 bash、dash、sh 等主流 Shell 中稳定运行。带 function 关键字的写法(如 function myfunc { ... })虽在 bash 中可用,但在某些轻量环境(如 Debian 默认的 dash)中会报错。
函数体里不声明形参,参数靠位置变量自动注入。定义时括号必须为空,不能写成 func($1, $2) 或 func(a,b) —— 这是常见误区。
函数调用:名字即命令,括号是陷阱
调用时直接写函数名,后面跟空格分隔的参数,例如 backup_files /var/log nginx。切记不要加括号,backup_files() 或 backup_files(/var/log) 都会被 Shell 当作命令查找,导致 “command not found” 错误。
调用前函数必须已定义。把函数定义放在脚本顶部,或确保 source 加载顺序正确。如果函数在条件块里定义(比如 if 语句内),而该分支未执行,后续调用就会失败。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
参数传递:$1 到 $# 是你的接口协议
函数体内通过 $1、$2…获取传入值,$# 得到参数个数,$@ 展开为完整参数列表(各参数保持独立,适合遍历),$* 合并为单字符串(中间用 IFS 分隔,慎用于含空格的路径)。
- 验证输入是否为数字:用
[[ $1 =~ ^[0-9]+$ ]]检查 $1 - 处理多个文件:循环
for file in "$@"; do ...; done - 判断是否漏传:用
if [ $# -lt 2 ]; then echo "用法:$0 <源> <目标>"; exit 1; fi
返回值与变量作用域:别让函数悄悄改了全局
return 只能返回 0–255 的整数,常用于表示成功(0)或错误码(1–255)。想取返回值,立刻读 $? —— 下一条命令一执行,它就变了。
函数内所有变量默认全局可见。如果只是临时计算,务必用 local 声明,比如 local tmp_dir=$(mktemp -d)。否则,不同函数用同名变量(如 i、result)会相互覆盖,调试时极难定位。
需要传出字符串?不用 return。用 echo 输出,调用方用 $(func ...) 捕获。这是 Shell 的惯用模式,比折腾 exit code 更自然、更灵活。

















