Linux Shell函数通过"$@"安全接收任意参数,用$#判断数量,shift分离固定与可变参数,兼容所有主流shell。

Linux Shell 函数本身不支持声明式可变参数(如 func(...)),但完全可以通过位置参数机制动态接收任意长度的参数列表,关键在于正确使用 "$@"、$# 和安全遍历方式。
用 "$@" 安全获取全部参数
这是最核心的操作:"$@" 会把每个传入参数原样保留为独立词元,即使含空格或特殊字符也不会被错误拆分。必须加英文双引号,否则等价于 $1 $2 $3...,遇到空格就断裂。
-
$@不加引号 → 危险!参数会被 shell 重新分词 -
"$*"→ 所有参数拼成一个字符串,用第一个 IFS 字符连接(通常是空格),破坏原始结构 -
"$@"→ 唯一推荐方式,保持各参数边界清晰
遍历参数并做计数
结合 $#(参数个数)和 for arg in "$@" 可完成通用处理:
- 先检查
if [ $# -eq 0 ]判断是否为空调用,避免逻辑异常 - 用
local i=1; for arg in "$@"; do echo "[$i] $arg"; ((i++)); done按序输出 - 不需要硬编码
$1~$9,也不必为第 10 个参数写${10}(兼容性差)
分离固定参数与可变参数
若前几个参数有固定语义(如命令名、目标路径),其余为待处理列表,可用 shift 移位:
- 例如函数调用:
backup /mnt/usb file1.txt file2.log "my notes.txt" - 在函数内先取
dest="$1",再执行shift,之后"$@"就只剩文件列表 - 支持
shift n一次移出多个,$#会自动更新
避免数组切片等高版本特性
像 ${@:2} 这类语法虽在 Bash 4.3+ 可用,但不符合 POSIX,且 dash、ash 等轻量 shell 不支持。依赖它会降低脚本可移植性。坚持用 shift + "$@" 组合,兼容所有主流 shell。











