shell脚本处理命令行参数关键在于正确使用位置参数和getopts:位置参数需用"$1"防空值、"$@"保分词、shift处理多参数;getopts解析短选项如-ab:c,通过optarg取值、optind定位,并需校验参数有效性及设默认值。

Shell脚本处理命令行参数,关键在两点:用对位置参数避免空值崩溃,再用 getopts 规范解析带选项的输入。不依赖外部工具,纯 Bash 就能覆盖绝大多数运维和自动化场景。
位置参数安全使用要点
位置参数($0、$1、$2…)是脚本最直接的输入入口,但极易因未传参或含空格而出错。
- 永远给变量加双引号:
if [ "$1" = "start" ],否则$1为空时会变成[ = "start" ],语法错误 - 检查参数个数:
if [ $# -lt 1 ]; then echo "Usage: $0 <command>"; exit 1; fi</command> - 遍历所有参数用
"$@",不是$*或$@—— 只有"$@"能正确保留每个参数的原始分词(比如"file name.txt"不会被拆成两个词) - 超过 9 个参数时,不能直接写
$10;先用shift移动,或改用数组:args=("$@"),再取${args[9]}(索引从 0 开始)
getopts 解析短选项的标准写法
getopts 是 Bash 内置命令,专为 -a -b value -c 这类传统 Unix 风格选项设计,轻量且可靠。
- 选项字符串定义规则:
"ab:c"表示支持-a(无参)、-b(需参数)、-c(无参);冒号必须紧跟在需参数的字母后 - 每次循环中,
opt存当前选项字母,OPTARG存其参数值(仅对带冒号的选项有效) - 非法选项触发
opt="?",缺参数时若 optstring 开头加冒号(如":ab:c"),则opt=":",便于统一捕获处理 - 解析结束后,
$OPTIND指向第一个非选项参数的位置;用shift $((OPTIND - 1))跳过已处理项,后续$1即剩余普通参数
常见错误与健壮性补充
很多脚本跑着跑着报错,往往卡在参数校验和默认值设置上。
- 选项参数不能紧贴值:
-fconfig.txt不被识别,必须写成-f config.txt或-f=config.txt(后者需额外处理) - 选项必须前置:
script.sh -v file.txt可以,但script.sh file.txt -v中的-v会被getopts忽略 - 务必初始化变量:比如
verbose=false,再在case中设为true,避免未触发选项时变量为空导致逻辑异常 - 长选项(
--help)getopts原生不支持;可先用set -- $(getopt -l help,debug -o h:d -- "$@")预转换,或直接用getopt命令替代
不复杂但容易忽略——把引号加上、把 $# 判掉、把 OPTARG 和 OPTIND 理清楚,参数解析就稳了。











