调用Shell函数需用空格分隔参数,函数内用$1、$2等取值;含空格参数须加引号;第10个及以上参数写为${10};用$#判断参数个数,"$@"推荐遍历;多参数建议用shift或getopts;常见错误包括误加括号、漏引号、函数后定义、混淆$0含义。

调用带参数的 Shell 函数很简单,关键在于两点:调用时用空格分隔参数,函数体内用 $1、$2 等位置变量取值。
调用语法:函数名后直接跟参数
不需要括号,也不用逗号,只用空格分隔:
myfunc arg1 arg2 "arg with space" arg4- 含空格的参数必须用引号包裹,否则会被拆成多个参数
- 参数之间严格用空格(不能用 Tab 或其他空白符替代)
函数体内如何获取参数
在函数定义中,使用标准位置变量读取传入值:
-
$1表示第一个参数,$2是第二个,依此类推 - 第 10 个及以上参数必须写成
${10}、${11}(花括号不可省) -
$#获取参数总个数,常用于判断是否传够了参数 -
$@和$*都能获取全部参数,但行为不同:"$@"保持每个参数独立(推荐遍历用),"$*"合并为单个字符串
处理大量参数或可选参数
当参数多、有选项(如 -f file、--verbose)时,建议配合 shift 或 while getopts:
- 用
while [ "$#" -gt 0 ]; do ...; shift; done逐个消费参数 - 对带选项的调用,优先用
getopts解析,更健壮、支持自动报错 - 避免在函数里直接依赖脚本级的
$1,可用local input=$1显式保存,防止作用域污染
常见错误提醒
几个容易踩的坑:
- 调用时写了括号,比如
myfunc("a", "b")—— Shell 不认这种写法,会报 command not found - 忘记引号导致含空格参数被截断,例如
myfunc file name.txt实际传了两个参数,不是预期的一个文件名 - 函数定义在调用之后 —— Shell 是顺序执行的,函数必须先定义再调用
- 误以为
$0是函数名 —— 其实它始终是当前 shell 或脚本名(如-bash或./script.sh)











