Bash case语句匹配数字模式异常:如何正确匹配指定数字组合?
问题描述
我有一个格式为<digit>, <digit>的字符串,需要判断它属于以下四类情况:
- 两个零
- 左零右非零
- 左非零右零
- 其他情况
我尝试了以下Bash代码:
case ... in "0, 0") ... ;; "0, ?") ... ;; "?, 0") ... ;; *) ... ;; esac
但该代码仅能匹配到「两个零」和「其他情况」,请问该如何修复?
修复方案
问题出在双引号上——Bash的case语句中,双引号会让模式里的通配符(比如?)失去特殊含义,被当作字面量字符处理,所以你的代码里"0, ?"实际是在匹配字符串0, ?,而非左零右任意单个字符的情况。
去掉模式的双引号,同时为了精准匹配数字(避免误匹配非数字字符),可以用[1-9]表示非零数字,修改后的代码如下:
# 假设你的字符串变量名为str case "$str" in 0,\ 0) # 处理两个零的逻辑 echo "两个零" ;; 0,\ [1-9]) # 处理左零右非零的逻辑 echo "左零右非零" ;; [1-9],\ 0) # 处理左非零右零的逻辑 echo "左非零右零" ;; *) # 处理其他情况的逻辑 echo "其他情况" ;; esac
补充说明
- 逗号后的空格需要用反斜杠转义(
\),确保模式能精确匹配字符串里的空格。 - 如果你的场景允许数字是多位数,可以把
[1-9]改成[1-9][0-9]*,匹配一位及以上的非零数字。
内容的提问来源于stack exchange,提问作者Max Smirnov
相关产品推荐
相关产品推荐

