如何限制BASH脚本中getopts的$OPTARG参数合法取值范围?
限制BASH脚本中-d选项的参数为指定合法值
嘿,要给你的脚本里的-d选项加上参数值的限制其实很简单,咱们只需要在捕获到-d的参数后,立刻检查它是不是在你预设的合法值列表里就行。我还顺便修正了原脚本里的一个小bug——原来的判断条件里误用了变量名,这会导致即使你传对了参数,脚本依然可能触发使用手册,现在一起给你改好啦。
修改后的完整脚本
usage () { echo "USAGE MANUAL" echo "-u -> displays this usage manual" echo "-t -> sets EXEC variable to echo" echo "-d -> sets DEPTH variable to one of: full, basic, minimal" exit 1 } # 定义允许的DEPTH合法值,你可以根据需求修改这个列表 ALLOWED_DEPTHS=("full" "basic" "minimal") while getopts ":t:u:d:" o; do case "${o}" in t) EXEC=echo ;; d) # 检查传入的参数是否在合法列表中 local valid=0 for val in "${ALLOWED_DEPTHS[@]}"; do if [[ "${OPTARG}" == "${val}" ]]; then valid=1 break fi done if [[ ${valid} -eq 0 ]]; then echo "错误:-d选项仅接受以下合法值:${ALLOWED_DEPTHS[*]}" usage fi DEPTH=${OPTARG} ;; u) usage ;; # 处理用户输入的未知选项 \?) echo "错误:未知选项 -${OPTARG}" usage ;; # 处理用户忘记给选项传参数的情况 :) echo "错误:选项 -${OPTARG} 需要传入参数" usage ;; esac done shift $((OPTIND-1)) # 修正原脚本的变量名错误:使用正确的变量名DEPTH和EXEC if [ -z "${DEPTH}" ] || [ -z "${EXEC}" ]; then echo "错误:必须同时指定-t和-d选项" usage fi
关键修改点说明
- 合法值定义:我添加了
ALLOWED_DEPTHS数组,把所有允许的-d参数值放进去,你可以随时修改这个列表来适配自己的需求 - 参数合法性检查:在处理
-d选项的分支里,我们遍历合法值数组,对比用户传入的OPTARG。如果不匹配,就输出明确的错误提示并调用使用手册退出 - 增强错误处理:新增了对未知选项和缺少参数的处理逻辑,让脚本的错误提示更清晰,用户更容易知道哪里出了问题
- 修复变量名bug:原脚本里的判断条件用了
${d}和${t},但实际定义的变量是DEPTH和EXEC,这个错误会导致参数检查失效,现在已经修正
测试示例
- 合法调用(正常执行):
./script -t -d full - 非法参数(触发错误提示):
./script -t -d deep - 缺少参数(触发错误提示):
./script -t -d
内容的提问来源于stack exchange,提问作者Márk Maros
相关产品推荐
相关产品推荐

