确定Bash变量是否为多个值之一
假设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 )
$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选项一样。”