向Shell函数传参与脚本一致:调用时空格分隔并建议引号包裹,函数内用$1、$2等取值,${10}以上需花括号,$#得参数个数,"$@"安全遍历,可结合:-设默认值、shift解析选项。

向 Shell 自定义函数传参和接收,和给脚本传参本质一致,关键在调用时写法和函数体内变量引用方式。
调用时直接跟参数,用空格分隔
定义好函数后,调用它时,在函数名后加空格,再依次写上参数值。含空格或特殊字符的参数建议用双引号包裹:
示例:myfunc "hello world" 42 "/tmp/file.txt"
这样就向 myfunc 传递了三个参数。不加引号可能导致单词被拆开(如 hello world 变成两个参数),引发逻辑错误。
函数体内用 $1、$2… 按位置取值
在函数定义体中,使用 $1 获取第一个参数,$2 获取第二个,依此类推。注意:
- $0 是当前 shell 进程名(不是函数名);
- 超过 9 的参数必须写成 ${10}、${11} 形式,否则 $10 会被解释为 $1 后跟字符 0。
常见写法:
-
local user="$1"—— 把第一个参数赋给局部变量 if [ -z "$2" ]; then echo "缺少第二个参数"; exit 1; fi-
echo "共收到 $# 个参数"——$#在函数内表示本次调用的参数个数
批量处理所有参数推荐用 "$@"
当需要遍历、转发或完整保留原始参数(尤其含空格或通配符时),务必用 "$@",而不是 $* 或未加引号的 $@:
正确循环方式:
for arg in "$@"; do echo "参数: [$arg]" done
"$@" 会把每个参数当作独立字符串处理,而 "$*" 会把全部参数拼成一个字符串(中间用空格连接),容易丢失原始分隔边界。
实用小技巧:参数校验与默认值
写健壮函数时,常需检查参数是否缺失或设置默认值:
-
file="${1:-/dev/stdin}"—— 若未传第一个参数,则file默认为/dev/stdin if [ $# -lt 2 ]; then echo "用法:$0 <源> <目标>"; exit 2; fi- 用
shift跳过已处理参数,适合解析多组键值对(如--port 8080 --host localhost)


















