如何在Bash脚本中用getopts有效校验-c参数的指定字符串输入?
嘿,我来帮你实现这个严格的参数校验功能!下面是两种实用的实现方式,你可以根据自己的习惯和维护需求选择:
方法一:用数组存储合法选项(易维护)
这种方式把所有合规组件放在数组里,后续要修改或新增选项时,只需要更新数组即可,非常适合需要频繁调整选项的场景。完整脚本如下:
#!/bin/bash # 定义所有合法的组件选项 VALID_COMPONENTS=("customer_builder" "customer_service" "historic_customer_builder" "stream_builder" "data_distributor") # Usage 提示函数 usage () { echo -e "Usage: $0 -r <region> -c <component>" echo -e "Available components:" # 动态遍历打印所有合法组件,避免手动写漏 for comp in "${VALID_COMPONENTS[@]}"; do echo -e " • $comp" done exit 1 } # 初始化参数变量 region="" component="" # 解析命令行参数 while getopts "r:c:" opt; do case $opt in r) region="$OPTARG" ;; c) component="$OPTARG" # 校验组件是否在合法列表内 is_valid=0 for valid_comp in "${VALID_COMPONENTS[@]}"; do if [[ "$component" == "$valid_comp" ]]; then is_valid=1 break fi done # 若不合法,输出错误并展示用法 if [[ $is_valid -eq 0 ]]; then echo "❌ Error: Invalid component '$component'" usage fi ;; # 处理无效选项 \?) echo "❌ Error: Invalid option -$OPTARG" usage ;; # 处理选项缺少参数的情况 :) echo "❌ Error: Option -$OPTARG requires an argument." usage ;; esac done # 确保两个必要参数都已提供 if [[ -z "$region" || -z "$component" ]]; then echo "❌ Error: Both -r (region) and -c (component) are required." usage fi # 这里可以添加你的业务逻辑 echo "✅ Region confirmed: $region" echo "✅ Component confirmed: $component"
方法二:用case语句直接匹配(更简洁)
如果你的组件选项不会频繁变动,直接用case语句匹配是更紧凑的选择,代码直观易懂:
#!/bin/bash usage () { echo -e "Usage: $0 -r <region> -c <component>" echo -e "Available components:" echo -e " • customer_builder" echo -e " • customer_service" echo -e " • historic_customer_builder" echo -e " • stream_builder" echo -e " • data_distributor" exit 1 } region="" component="" while getopts "r:c:" opt; do case $opt in r) region="$OPTARG" ;; c) # 直接用case匹配所有合法组件 case $OPTARG in customer_builder|customer_service|historic_customer_builder|stream_builder|data_distributor) component="$OPTARG" ;; *) echo "❌ Error: Invalid component '$OPTARG'" usage ;; esac ;; \?) echo "❌ Error: Invalid option -$OPTARG" usage ;; :) echo "❌ Error: Option -$OPTARG requires an argument." usage ;; esac done if [[ -z "$region" || -z "$component" ]]; then echo "❌ Error: Both -r and -c options are required." usage fi echo "✅ Region: $region" echo "✅ Component: $component"
两种方法都能实现你要的严格字符串匹配校验,按需选用就好~
内容的提问来源于stack exchange,提问作者noober
相关产品推荐
相关产品推荐

