Bash脚本如何获取带参数的用户输入以构建case条件分支
Shell 脚本处理长格式命令行参数的分支判断实现
需求说明
需要兼容两类带长选项的执行入参,根据入参差异执行不同逻辑:
- 入参格式1:
./iwant2reload-worker.sh --target=cluster --cluster-name=abc,命中后运行程序a - 入参格式2:
./iwant2reload-worker.sh --target=workernode --workernode-name=xyz,命中后运行程序b
实现思路
针对--key=value格式的长选项入参,不推荐直接匹配全量命令字符串做判断——这种方式对参数顺序兼容性极差。正确做法是先把所有入参拆解为独立的键值对存入变量,再基于核心的--target取值做分支判断,同时补充配套参数的必填校验。
完整可运行脚本
#!/bin/bash # 初始化入参存储变量 OP_TARGET="" CLUSTER_NAME="" WORKER_NODE_NAME="" # 逐行解析所有传入的命令行参数 for arg in "$@"; do case "$arg" in --target=*) OP_TARGET="${arg#*=}" shift ;; --cluster-name=*) CLUSTER_NAME="${arg#*=}" shift ;; --workernode-name=*) WORKER_NODE_NAME="${arg#*=}" shift ;; *) echo "错误:存在未识别的参数 $arg" exit 1 ;; esac done # 基于解析得到的目标值做分支判断 case "$OP_TARGET" in cluster) # 校验集群名参数是否传入 if [ -z "$CLUSTER_NAME" ]; then echo "错误:指定target为cluster时,必须通过--cluster-name传入集群名称" exit 1 fi # 匹配到第一条执行路径,运行程序a /path/to/program_a --target-cluster="$CLUSTER_NAME" ;; workernode) # 校验节点名参数是否传入 if [ -z "$WORKER_NODE_NAME" ]; then echo "错误:指定target为workernode时,必须通过--workernode-name传入节点名称" exit 1 fi # 匹配到第二条执行路径,运行程序b /path/to/program_b --target-node="$WORKER_NODE_NAME" ;; *) echo "错误:必须通过--target指定操作类型,可选值为 cluster / workernode" exit 1 ;; esac
关键注意事项
- 这套实现对参数顺序无要求,哪怕用户把
--cluster-name放到--target前面传入,也能正常解析识别 - 增加的必填参数校验可以避免用户漏传配套参数时,程序出现无意义的执行报错
- 禁止直接用
$1、$2这类固定位置判断入参:长选项格式的入参顺序不固定,硬编码位置会大幅降低脚本兼容性
内容的提问来源于stack exchange,提问作者Chayan
相关产品推荐
相关产品推荐

