检查bash变量是否与多个值匹配

3

我想在我的Bash脚本中检查输入参数。由于可能有很多组合,所以我决定使用类似这样的结构:

if  ( [[ "$2" = "(PARAM1|PARAM2|PARAM3)" && "$3" = "(PARAM11|PARAM22|PARAM33)" ]] )

我原本期望这行代码将检查哪个参数被指定了,(因为有可能出现参数组合,例如PARAM1 PARAM22或者PARAM11 PARAM3等)。

但实际上它并没有起到作用。我应该使用数组还是需要尝试其他语法?


3
你没有必要为了此事创建一个子shell,应该在这里使用正则表达式匹配=~ - Jason Hu
1个回答

5
你可能需要重新阅读bash手册中“复合命令”和“条件表达式”的部分(按照手册中的大写字母)。你的问题将条件放在子shell中,这是不必要的。
如果你想使用正则表达式匹配参数($2、$3等),可以使用以下格式:
if [[ $2 =~ ^(foo|bar)$ ]]; then
   ...
fi

或者:

if [[ $2 =~ ^(foo|bar)$ ]] && [[ $3 =~ ^(baz|flarn)$ ]]; then
   ...
fi

话虽如此,在这里并不真正需要使用正则表达式。与简单的模式匹配相比,正则表达式会使用更多的CPU。我可能会使用case语句来处理:

case "$2" in
  foo|bar)
    case "$3" in
      glurb|splat)
      # do something
      ;;
    esac
    ;;
  baz)
    # do something else
    ;;
esac

具体如何处理参数取决于您对它们需要做什么,而您在问题中没有分享这方面的细节。如果您更新问题以包含更多详细信息,我很乐意更新此答案。 :)


非常感谢您的帮助,我已经尝试在我的脚本中使用case,它运行良好 :) - Nikita Afanasev
太好了,我很高兴能帮到您。请随意点击我的答案旁边的复选标记以关闭问题。 - ghoti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接