补充说明
getopts 是 POSIX 规定的 shell 内建命令,用来在脚本中解析以 - 开头的短选项(如 -a -b value)。它由 bash、dash、ksh 等 shell 直接实现,不依赖外部程序,因此脚本可移植性很好。
工作方式:每次调用从参数列表中取出一个选项,把选项字符存入指定变量,把该选项的参数存入 OPTARG,并用 OPTIND 记录下一个待处理参数的位置。选项串中字符后跟冒号表示该选项需要参数(如 "ab:c"),开头加冒号则让错误信息由脚本自行处理。
getopts 不处理长选项(--verbose 之类)。需要长选项、选项重排或子命令时,通常改用 GNU getopt 命令,或直接手写 case 循环。
语法
getopts 选项串 变量名 [参数...]
说明
OPTARG:当前选项的参数值OPTIND:下一个待处理的参数下标,解析结束后可用shift $((OPTIND-1))处理剩余位置参数- 选项串以
:开头时进入静默模式:非法选项把变量置为?,缺参数置为:,并设置OPTARG - 解析结束时返回非 0,循环退出
实例
#!/bin/bash
# 解析 -v 开关与 -f 文件名、-n 数字
verbose=0
file=""
count=1
while getopts ":vf:n:" opt; do
case "$opt" in
v) verbose=1 ;;
f) file="$OPTARG" ;;
n) count="$OPTARG" ;;
:) echo "选项 -$OPTARG 需要一个参数" >&2; exit 1 ;;
\?) echo "未知选项: -$OPTARG" >&2; exit 1 ;;
esac
done
# 去掉已解析的选项,剩下的才是位置参数
shift $((OPTIND - 1))
echo "verbose=$verbose file=$file count=$count args=$*"
# 保存并运行后测试
./script.sh -v -f data.txt -n 3 extra1 extra2