首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使case语句匹配一个数字范围?

如何使case语句匹配一个数字范围?
EN

Stack Overflow用户
提问于 2014-08-25 08:23:19
回答 2查看 83.8K关注 0票数 58

我正在运行一个列号可以在0-50范围内的开关箱。现在每一种情况都支持离散的列数,我观察到它的失效。

以下是代码:

代码语言:javascript
复制
    i=10
    a=1
    b=0.65
    if [ "$a" != "$b" ]; then 
       case $i in  
            [1]|[2]|[5]) echo "Not OK"; ;; 
            [9-10]|[12]) echo "may be ok"; ;; 
            *) echo "no clue - $i"; ;; 
       esac
   fi

我希望这段代码输出may be ok,但得到no clue - 10

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-25 08:40:02

Bash case不适用于数字范围。[]用于shell模式。

例如,这种情况下,[1-3]5|6)将适用于15、25、35或6。

您的代码应该如下所示:

代码语言:javascript
复制
i=10
a=1
b=0.65
if [ "$a" != "$b" ] ; then
   case $i in
        1|2|5) echo "Not OK"; ;;
        9|10|12) echo "may be ok"; ;;
        *) echo "no clue - $i"; ;;
   esac;
fi

如果i可以是介于9和10之间的real ,那么您需要在范围中使用if (而不是大小写)。

票数 106
EN

Stack Overflow用户

发布于 2017-07-01 09:12:54

if [ 解决方案

代码语言:javascript
复制
arg=1
if [ "$arg" -lt 5 ]; then
  echo 'less than 5'
elif [ "$arg" -lt 15 ]; then
  echo 'less than 15'
elif [ "$arg" -eq 17 ] || [ "$arg" -eq 19 ]; then
  echo '17 or 19'
else
  echo 'neither'
fi

POSIX 7

Bash遵循https://stackoverflow.com/a/25482040/895245提到的POSIX

以下是引号:01部分"Case条件构造“:

条件构造案例应该执行与几个模式中的第一个模式对应的复合列表(见模式匹配表示法).具有相同的复合列表的多个模式将由“\”符号分隔。..。 案例结构的格式如下: case word in ( pattern1 )复合列表;;[(模式\模式.)复合列表;;] . [(模式.)[ esac ]

然后13部分"2.13.模式匹配表示法“说:

[如果一个开括号引入了一个括号表达式,就像在XBD括号表达式中一样。

扩展正则表达式指出了“9.3.5RE括号表达式”一节,其中说:

括号表达式(括在方括号中的表达式,"[]“)是一个RE,它应该匹配一组特定的单个字符,并且可以根据包含在括号表达式中的非空列表表达式集匹配一组特定的多字符排序元素。

因此,当您执行以下操作时,只考虑单个字符:

代码语言:javascript
复制
[9-10]
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25481799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档