假設Bash變量$x
有三個有效值:foo
,bar
和baz
。如何寫一個表達式來確定$x
是否是這些值之一?在Python中,例如,人們可能會寫:確定Bash變量是否爲多個值之一
x in ('foo', 'bar', 'baz')
是否有猛砸等同,或者是否有必要進行三個比較?再次,在Python中,可以這樣寫:
x == 'foo' or x == 'bar' or x == 'baz'
在Bash中表達上述內容的正確方法是什麼?
假設Bash變量$x
有三個有效值:foo
,bar
和baz
。如何寫一個表達式來確定$x
是否是這些值之一?在Python中,例如,人們可能會寫:確定Bash變量是否爲多個值之一
x in ('foo', 'bar', 'baz')
是否有猛砸等同,或者是否有必要進行三個比較?再次,在Python中,可以這樣寫:
x == 'foo' or x == 'bar' or x == 'baz'
在Bash中表達上述內容的正確方法是什麼?
最簡單的方法:
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
使用case語句:
var=bar
case $var in
foo | bar | baz)
echo "Matches"
;;
esac
我怎麼能錯過一個。當然,這是做這件事的好方法。 +1 – naab
人們可以使用||
爲交替[[
和]]
之間:
if [[ $x == foo || $x == bar || $x == baz ]] ; then
echo valid
else
echo invalid
fi
+1,但請注意,不引用正確的操作數意味着它們不是解釋爲文字,而是解釋爲_patterns_(globs) - 在這種特定情況下沒有區別,但重要的是要注意區別。 – mklement0
我不知道'shopt -s extglob'。謝謝! – davidchambers