Bash脚本中case语句如何实现两个输入变量的组合匹配
Bash case 语句组合匹配修正方案
原脚本核心问题
- 分支模式逻辑错误:如
1+A|a的写法,在bash case规则中会被拆解为两个独立匹配目标:要么匹配完整字符串1+A,要么匹配单独字符串a,完全无法实现“第一输入为1、第二输入为任意大小写A”的组合匹配。 - 大小写覆盖不足:原有模式仅匹配大写A/B输入,用户输入小写a/b时无法触发对应分支。
- 退出分支失效:
option是两个输入用+拼接的格式,即使第一个输入为5,实际值为5+xxx,永远匹配不上单独的5规则。
调整思路
- 用bash标准通配符构造组合匹配规则:针对第二输入的大小写场景,用
[Aa]、[Bb]的通配格式覆盖任意大小写输入,避免错误使用|分隔符打乱组合逻辑。 - 调整退出分支的匹配规则,兼容第一个输入为5时,第二个输入任意值的场景。
- 补充默认兜底分支,对无效输入给出明确提示。
修正后完整代码
#!/bin/bash hw() { echo "hello world" } h0() { echo "hello w0r16" } h3w() { echo "h3ll0 world" } h30() { echo "h3110 w0rld" } read -p "enter 1 for hello and 2 for h3110: " hello read -p "enter A for world and B for w0r16: " world1 option=$hello+$world1 case $option in 1+[Aa]) hw;; 1+[Bb]) h0;; 2+[Aa]) h3w;; 2+[Bb]) h30;; 5+*) echo "You have chosen to exit script" && exit 1;; *) echo "Invalid input combination";; esac
可选简化方案
如果使用bash 4.0及以上版本,可以在拼接option前将两个输入统一转换为大写,省略每个分支的大小写通配写法:
# 拼接option前增加大小写统一转换 hello=${hello^^} world1=${world1^^} option=$hello+$world1 case $option in 1+A) hw;; 1+B) h0;; 2+A) h3w;; 2+B) h30;; 5+*) echo "You have chosen to exit script" && exit 1;; *) echo "Invalid input combination";; esac
两种方案实现效果完全一致,可根据个人编码习惯选择。
内容的提问来源于stack exchange,提问作者User10
相关产品推荐
相关产品推荐

