You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:41:22