确定Bash变量是否为多个值之一

确定Bash变量是否为多个值之一,bash,validation,Bash,Validation,假设Bash变量$x有三个有效值:foo、bar和baz。如何编写表达式来确定$x是否为这些值之一?例如,在Python中,可以编写: x in ('foo', 'bar', 'baz') 是否有Bash等价物,或者是否需要执行三个比较?同样,在Python中,可以编写: x == 'foo' or x == 'bar' or x == 'baz' 用Bash表达上述内容的正确方式是什么?使用case语句: var=bar case $var in foo | bar | baz )

假设Bash变量
$x
有三个有效值:
foo
bar
baz
。如何编写表达式来确定
$x
是否为这些值之一?例如,在Python中,可以编写:

x in ('foo', 'bar', 'baz')
是否有Bash等价物,或者是否需要执行三个比较?同样,在Python中,可以编写:

x == 'foo' or x == 'bar' or x == 'baz'
用Bash表达上述内容的正确方式是什么?

使用case语句:

var=bar
case $var in
  foo | bar | baz )
    echo "Matches"
    ;;
esac

可以使用
|
[[
]
之间进行交替:

if [[ $x == foo || $x == bar || $x == baz ]] ; then
  echo valid
else
  echo invalid
fi
最简单的方法:

case $x in
    foo|bar|baz) echo is valid ;;
    *) echo not valid ;;
esac
有点复杂

shopt -s extglob
if [[ $x == @(foo|bar|baz) ]]; then
    echo is valid
else
    echo not valid
fi
更复杂的是:

is_valid() {
    local valid=( foo bar baz )
    local value=$1
    for elem in "${valid[@]}"; do
        [[ $value == $elem ]] && return 0
    done
    return 1
}

if is_valid "$x"; then
    echo is valid
else
    echo not valid
fi

我怎么会错过那个。当然这是个好办法+1+1,但请注意,不引用正确的操作数意味着它们不是被解释为文字,而是被解释为模式(glob)-在这种特定情况下没有区别,但重要的是要注意区别。我不知道
shopt-s extglob
。谢谢在此上下文中,它不是必需的:从“当使用“
=
”和“
!=
”运算符时,运算符右侧的字符串被视为一种模式,并根据中描述的规则进行匹配,就好像启用了
extglob
shell选项一样。”