2014-04-12 54 views
3

假設Bash變量$x有三個有效值:foo,barbaz。如何寫一個表達式來確定$x是否是這些值之一?在Python中,例如,人們可能會寫:確定Bash變量是否爲多個值之一

x in ('foo', 'bar', 'baz') 

是否有猛砸等同,或者是否有必要進行三個比較?再次,在Python中,可以這樣寫:

x == 'foo' or x == 'bar' or x == 'baz' 

在Bash中表達上述內容的正確方法是什麼?

回答

4

最簡單的方法:

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 
+0

我不知道'shopt -s extglob'。謝謝! – davidchambers

6

使用case語句:

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

我怎麼能錯過一個。當然,這是做這件事的好方法。 +1 – naab

1

人們可以使用||爲交替[[]]之間:

if [[ $x == foo || $x == bar || $x == baz ]] ; then 
    echo valid 
else 
    echo invalid 
fi 
+1

+1,但請注意,不引用正確的操作數意味着它們不是解釋爲文字,而是解釋爲_patterns_(globs) - 在這種特定情況下沒有區別,但重要的是要注意區別。 – mklement0

相關問題