如何使用getopts仅处理长选项(无短选项)并实现参数自动解析为同名变量?
如何使用getopts仅处理长选项(无短选项)并实现参数自动解析为同名变量?
嘿,我刚好写了个实用的脚本能搞定这个需求——用getopts专门处理长选项,还能自动把参数解析成和选项同名的变量,前提是这个选项在我们预先定义的合法列表里。话不多说,直接上代码加拆解:
首先是完整的核心实现代码:
# 先定义所有允许的长选项,用逗号分隔方便后续处理 optslist=h,help,lat,lon,temp,rain,pop,cdate,cyyyy,cmm,cdd,ctmin,ctmax,crain,cpop,tmiss,rmiss,nday,nhead,nheadt,nheadr,nheadp,climfile,datafile, while getopts h-: OPT; do # 兼容-h和--形式的选项触发 # 处理长选项的核心转换逻辑 if [ "$OPT" = "-" ]; then # 识别到--开头的长选项,重新整理OPT和参数 OPT="${OPTARG%%=*}" # 抠出长选项的名称(比如--lat=30里的lat) OPTARG="${OPTARG#"$OPT"}" # 提取选项后的内容(包括等号) OPTARG="${OPTARG#=}" # 去掉参数开头的等号,得到纯净的参数值 fi found=false # 遍历合法选项列表,匹配当前处理的选项 for arg in ${optslist//,/ } ; do case "$OPT" in h | help ) # 这里的usage是你自己预先写好的帮助信息函数,执行后直接退出 usage exit ;; "$arg" ) # 自动把参数值赋值给和选项同名的变量 if [ -n "$OPTARG" ]; then eval "$arg=\"$OPTARG\"" found=true fi ;; esac done # 遇到非法选项直接报错并调用帮助 if ! $found; then echo "错误:未知选项 --$OPT" >&2 usage exit 1 fi done
给你拆解下关键部分的作用,方便你理解和修改:
- 合法选项列表:
optslist用逗号把所有支持的长选项列出来,后面会把逗号换成空格来遍历,这样能快速检查输入的选项是否合法。 - 长选项拆分逻辑:当getopts捕捉到
-(也就是--开头的选项),会把--temp=25这种格式拆成选项名temp和参数值25,去掉多余的等号,让参数值更干净。 - 自动赋值核心:遍历合法选项时,一旦匹配到当前处理的选项,就用
eval把参数值直接塞到同名变量里——比如你输入--climfile=./clim_data.nc,脚本里的climfile变量就会被设为./clim_data.nc,完全不用每个选项都单独写case分支,省超多事! - 错误拦截:如果输入了不在列表里的选项,会立刻报错并弹出帮助信息,避免非法参数搞乱脚本逻辑。
举个实际用例,假设你执行脚本时输入:
./your_script.sh --lat=30.5 --lon=121 --datafile=./input_data.txt
脚本跑完后,lat变量值就是30.5,lon是121,datafile是./input_data.txt,后续逻辑直接用这些变量就行啦!
备注:内容来源于stack exchange,提问作者ClimateUnboxed
相关产品推荐
相关产品推荐

