linux shell 中可通过参数扩展(如 ${1:-default})模拟默认参数,结合 local 变量、参数校验和开关解析,实现简洁健壮的函数封装。

Linux Shell 中无法像 Python 那样直接声明带默认值的函数参数,但可以通过参数扩展(Parameter Expansion)和位置参数逻辑模拟出“默认参数”的效果,实现既简洁又健壮的封装。
用 ${1:-default} 实现参数默认值
Shell 不支持语法层面的默认参数,但借助 ${parameter:-word} 这类扩展,可在函数体内为每个参数提供 fallback 值:
- 若调用时传了第一个参数(
$1),就用它;没传或为空,就用指定默认值 - 推荐在函数开头统一赋值,让逻辑清晰、易维护
示例:
backup_file() {
local src="${1:-./data.txt}" # 默认备份当前目录下的 data.txt
local dest="${2:-/backup/}" # 默认存到 /backup/
local compress="${3:-yes}" # 默认启用压缩
<p>if [[ "$compress" == "yes" ]]; then
tar -czf "${dest}$(basename "$src").tar.gz" "$src"
else
cp "$src" "$dest"
fi
}</p>
调用方式灵活:backup_file(全用默认)、backup_file /tmp/log(只改第一个)、backup_file /tmp/log /mnt/usb no(全部指定)。
用 local 变量 + 参数校验增强可靠性
仅靠 ${:-} 不够,还需结合局部变量作用域和基础校验,避免误用空值:
- 用
local声明所有变量,防止污染全局环境 - 对关键参数(如文件路径、数据库名)加非空检查,失败时给出明确提示
- 用
[[ -n "$var" ]]判断是否真正有值,而非仅依赖默认扩展
例如:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
deploy_service() {
local env="${1:-prod}"
local tag="${2:-latest}"
<p>[[ -n "$env" ]] || { echo "Error: environment required" >&2; return 1; }
[[ -n "$tag" ]] || { echo "Error: image tag required" >&2; return 1; }</p><p>echo "Deploying $tag to $env..."</p><h1>实际部署命令...</h1><p>}</p>
支持可选开关参数(--flag 形式)
当需要布尔型开关(如 --dry-run、--verbose),可用 while+case 解析,并设默认 false:
- 用
local dry_run=0初始化开关状态 - 遇到
--dry-run就设为 1,其他参数按需处理 - 最后统一判断
[[ $dry_run -eq 1 ]]执行分支逻辑
这样比硬编码位置更清晰,也兼容未来新增选项。
组合使用提升复用性
把默认值逻辑和功能解耦,能快速派生专用函数:
- 定义一个通用
run_sql(),含数据库、用户、默认格式等默认值 - 再封装
query_users()和count_orders(),内部调用run_sql并预填固定 SQL 和参数 - 用户只需记简单名字,不用每次拼接长命令
本质是:默认值提供基线配置,函数封装提供语义接口,两者配合才真正降低使用门槛。










