linux shell函数传参缺失是运行时逻辑缺陷,须提前拦截、明确报错、快速定位;用$#校验参数个数,[ -z "$1" ]检查非空,封装require_arg复用,附usage提示,设默认值${3:-30},结合set -u和local提升健壮性。

Linux Shell 函数封装中,传参缺失不是语法错误,而是运行时逻辑缺陷。优雅处理的关键不在于“兜底执行”,而在于**提前拦截、明确报错、快速定位**——让调用者一眼看懂缺了什么、该传什么。
用 $# 显式校验参数个数
Shell 不支持默认参数或可选参数声明,所以必须手动检查。在函数开头第一行就判断参数数量,比后续任何逻辑都重要。
- 用 $# 获取实际传入参数个数,配合 -ne(不等于)、-lt(小于)等测试条件
- 错误提示要带函数名和期望数量,例如:error: print_welcome requires exactly 1 argument
- 校验后立即 exit 1 或 return 1,避免继续执行产生不可预期结果
对关键参数做存在性与非空校验
有些参数虽有值,但可能是空字符串(如 print_welcome ""),这在业务上往往等同于缺失。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 用 [ -z "$1" ] 判断第一个参数是否为空,[ -n "$2" ] 判断第二个是否非空
- 若参数是路径、文件名、数字等类型,可追加简单验证,比如 [[ "$1" =~ ^[0-9]+$ ]] 检查是否纯数字
- 把校验逻辑封装成小函数复用,例如
require_arg() { [ -n "$1" ] || { echo "error: missing $2"; return 1; }; }
提供清晰的 usage 提示和默认行为开关
用户输错时,光报错不够,还要告诉ta怎么对。同时,对非核心参数可设计安全降级路径。
- 在报错后附上简短 usage 示例:usage: calculate_sum
- 对非必需参数(如日志级别、超时时间),允许不传,但内部设合理默认值:local timeout=${3:-30}
- 避免用
if [ $# -lt 2 ]; then set -- "$1" "default_value"; fi这类隐式补全,它掩盖问题,不利于调试
结合 set -u 提升脚本整体健壮性
全局启用未定义变量检测,能让参数缺失问题在更早阶段暴露,而不是等到 $1 被误用时才出错。
- 在脚本顶部加 set -u(或 set -o nounset),之后所有未赋值变量引用都会报错
- 配合 local 使用:函数内用
local name="$1"把参数显式绑定到局部变量,既防污染又避免直接引用$1时因为空触发set -u中断 - 注意:
set -u对位置参数本身无效($1总是存在),但它能捕获你基于参数构造的其他变量,比如file_path="$1/.config"中$1为空导致file_path变成/.config这类低级错误










