linux shell函数通过$1、$2等位置参数捕获外部输入,需用"${1}"防拆分、${1:-default}设默认值、${1:?err}校验非空,并推荐getopts解析选项及local声明局部变量确保安全。

Linux Shell函数中捕获外部传入参数,核心是通过位置参数 $1、$2…$n 获取调用时传入的值。Shell 不支持真正的“引用传递”或自动绑定变量名,所有参数都以字符串形式按顺序传入,需在函数体内显式使用。
基本参数捕获方式
函数被调用时,shell 自动将参数依次赋给特殊变量:
- $1 表示第一个参数,$2 是第二个,依此类推
- $# 返回参数总个数,可用于校验输入是否足够
- $@ 展开为全部参数(每个参数独立引号包裹),适合转发给其他命令
- $* 展开为全部参数(整体作为一个字符串),一般少用,易引发空格截断问题
安全使用参数的常见实践
直接写 容易出错,推荐加上花括号和默认值保护:
- 用
${1:-default}提供默认值,避免参数为空时报错 - 用
${1:?error message}强制非空,缺失时立即报错退出 - 对含空格或特殊字符的参数,始终用双引号包裹:
"${1}",防止单词拆分 - 检查参数数量:
if [ $# -lt 2 ]; then echo "Usage: func arg1 arg2"; exit 1; fi
处理多个或可选参数的技巧
简单位置参数适用于固定结构;复杂场景建议结合 getopts(内置)或 getopt(增强版)解析:
while getopts "a:b:c" opt; do case $opt in a) arg_a="${OPTARG}";; b) arg_b="${OPTARG}";; c) flag_c=1;; esac; done- 解析后,参数就变成命名变量(如
arg_a),逻辑更清晰、容错更强 - 注意:getopts 只支持单字符选项(如
-a、-b),不支持长选项(--help);需长选项请用外部getopt命令
避免全局污染:局部变量优先
函数内若需修改或暂存参数值,应声明为局部变量:
- 用
local varname="${1}"明确限定作用域,防止意外覆盖同名全局变量 - 尤其在嵌套调用或 sourced 脚本中,
local能显著提升可靠性 - 未加
local的变量默认全局可见,容易引发隐蔽冲突











