假设Bash变量$x
有三个有效值:foo
,bar
和baz
。如何编写表达式来确定$x
是否是这些值之一?例如,在Python中,可以写一下:
x in ('foo', 'bar', 'baz')
是否有Bash等价物,还是有必要进行三次比较?再次,在Python中,人们可以写:
x == 'foo' or x == 'bar' or x == 'baz'
在Bash中表达上述内容的正确方法是什么?
答案 0 :(得分:6)
使用案例陈述:
var=bar
case $var in
foo | bar | baz )
echo "Matches"
;;
esac
答案 1 :(得分:6)
最简单的方法:
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
答案 2 :(得分:1)
可以使用||
在[[
和]]
之间进行更改:
if [[ $x == foo || $x == bar || $x == baz ]] ; then
echo valid
else
echo invalid
fi