Bash脚本长选项匹配过松:如何限制仅接受完整参数?
问题解答:Bash脚本getopt接受前缀长选项的原因及解决办法
原因分析
你遇到的问题是因为GNU getopt默认允许长选项的部分匹配——只要输入的前缀能唯一对应一个定义好的长选项,就会被自动识别为该选项。比如你只定义了--environment这一个以env开头的长选项,所以--env、--envi这类前缀都会被匹配到--environment。
解决方法
要强制脚本只接受完整的长选项,只需在调用getopt时添加--no-partial参数即可,这个参数会禁用前缀匹配功能,只有完全符合定义的长选项才会被识别。
修改后的关键代码
# 添加--no-partial参数禁用前缀匹配 args=$(getopt -a -o e: --long 'help,environment:' --no-partial -- "$@") if [[ $? -gt 0 ]]; then usage fi eval set -- ${args} while : do case $1 in -e | --environment) { case $2 in PROD) CHECK_FILE=${NFS_MOUNT_PROD}/${FILE_MONITORING}; break ;; INT) CHECK_FILE=${NFS_MOUNT_INT}/${FILE_MONITORING}; break ;; *) usage; exit 1;; # 注意原脚本的exit1是语法错误,需改为exit 1 esac } shift 2 ;; --help) usage ; shift ;; --) shift; break ;; *) >&2 echo Unsupported option: $1 usage ;; esac done
另外注意原脚本里的exit1是语法错误,需要改成exit 1,否则运行时会报错。
内容的提问来源于stack exchange,提问作者Wurzelseppi
相关产品推荐
相关产品推荐

