如何使Bash开关盒匹配多个数字范围条件?

sha*_*mik 55 bash switch-statement

我正在使用列号运行switch case,我的列号可以是0到50.在循环中运行时 - 它们会得到验证.现在每个案例都支持离散列号,我发现它失败了.示例:我的列号是10,这是代码 -

    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
Run Code Online (Sandbox Code Playgroud)

我希望"可能没问题",但没有任何线索 - 10

Arn*_*lca 101

Bash case不适用于数字范围.[]用于贝壳图案.

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

您的代码应如下所示:

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
Run Code Online (Sandbox Code Playgroud)

如果i可以real 9到10 之间,那么你需要使用if(而不是大小写)范围.


Cir*_*四事件 5

if[解决方案

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
Run Code Online (Sandbox Code Playgroud)

POSIX 7

Bash 遵循/sf/answers/1783742831/提到的 POSIX

这是引用:http : //pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01 “案例条件构造”部分:

条件构造案例应执行与多个模式中的第一个相对应的复合列表(请参阅模式匹配表示法)[...] 具有相同复合列表的多个模式应由“|”分隔 象征。[...]

case 结构的格式如下:

case word in
     [(] pattern1 ) compound-list ;;
     [[(] pattern[ | pattern] ... ) compound-list ;;] ...
     [[(] pattern[ | pattern] ... ) compound-list]
  esac
Run Code Online (Sandbox Code Playgroud)

然后http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13部分“2.13. 模式匹配符号”说:

[ 如果一个左括号引入一个括号表达式,如 XBD RE 括号表达式

扩展的正则表达式指向“9.3.5 RE Bracket Expression”部分,它说:

方括号表达式(包含在方括号中的表达式 "[]" )是一个 RE,它应匹配一组特定的单个字符,并且可以匹配一组特定的多字符整理元素,基于非空的集合列出括号表达式中包含的表达式。

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

[9-10]
Run Code Online (Sandbox Code Playgroud)