2011-05-02 42 views
9

有沒有方法可以測試一個數組是否包含指定的元素?bash中的數組運算符

例如,像:

array=(one two three) 

if [ "one" in ${array} ]; then 
... 
fi 

回答

18

一個for循環將做的伎倆。

array=(one two three) 

for i in "${array[@]}"; do 
    if [[ "$i" = "one" ]]; then 
    ... 
    break 
    fi 
done 
+2

歡迎來到SO Frank。偉大的第一回答。 – John 2011-05-02 18:35:35

0
array="one two three" 
if [ $(echo "$array" | grep one | wc -l) -gt 0 ] ; 
    then echo yes; 
fi 

如果這是醜陋的,你可以把它隱藏掉的功能。

+1

如果你egrep的單詞邊界,'egrep「\ bone \ b」',你將防止array =「onex two three」匹配'one'。 ''echo「$ array」| egrep「\ bone \ b」&& echo hit || echo miss''就足夠了 - wc-l和-gt0是superflous。 – 2011-05-02 03:55:04

+1

不需要測試('[')。只需使用grep的返回值即可。 – 2011-05-02 13:50:44

0

,如果你只是想檢查一個元素是否在數組,另一種方法

case "${array[@]/one/}" in 
"${array[@]}") echo "not in there";; 
*) echo "found ";; 
esac 
+1

這是否與[此答案](http://stackoverflow.com/a/5853138/2533433)具有相同的問題 - 即在「誠實」上回顯「發現」? 'foo =(誠實的單身); echo「$ {foo [@]/one /}」'給出'hst man',因此將返回「找到」與您的解決方案。 – Izzy 2014-11-07 20:27:37

5

試試這個:

array=(one two three) 
if [[ "${array[*]}" =~ "one" ]]; then 
    echo "'one' is found" 
fi 
+3

除非數組是''array =(scone honest)'',它實際上不能被認爲包含'one'元素,但會被'=〜'操作符匹配。 – 2011-05-02 03:49:37

+0

@Jonathan oops,你說得對。我投了[@Frank的回答](http://stackoverflow.com/questions/5852446/in-array-operator-in-bash/5852473#5852473)。 – pepoluan 2011-05-02 04:08:38

+0

沒有真正解決這個問題*一般*,但在許多情況下可能有幫助(至少當每個數組元素只包含一個單詞時):使正則表達式(右站點)'=〜「\ bone \ b」 '只匹配整個單詞。我喜歡簡單! – Izzy 2014-11-06 15:25:06

3

我得到了我的.bashrc文件的功能「包含」:

contains() 
{ 
    param=$1; 
    shift; 
    for elem in "[email protected]"; 
    do 
     [[ "$param" = "$elem" ]] && return 0; 
    done; 
    return 1 
} 

它的工作原理以及使用數組:

contains on $array && echo hit || echo miss 
    miss 
contains one $array && echo hit || echo miss 
    hit 
contains onex $array && echo hit || echo miss 
    miss 

但並不需要一個數組:

contains one four two one zero && echo hit || echo miss 
    hit 
1

我喜歡用grep此:

if echo ${array[@]} | grep -qw one; then 
    # "one" is in the array 
    ... 
fi 

(注意這兩個-q-w是非標準選項給grep:-w告訴它只處理整個單詞,並且-q(「安靜」)抑制所有輸出。)

+0

注意這也僅適用於元素是單個單詞(如示例中所示)。用它來檢查'array =(「一個人」,「兩匹馬」)中的元素「one」會錯誤地產生它(因爲「one」是一個單詞*包含*,即第一個元素的一部分) ,儘管它不是(作爲一個獨立的元素)。 – Izzy 2014-11-08 12:01:34

0
In_array() { 
    local NEEDLE="$1" 
    local ELEMENT 

    shift 

    for ELEMENT; do 
     if [ "$ELEMENT" == "$NEEDLE" ]; then 
      return 0 
     fi 
    done 

    return 1 
} 

declare -a ARRAY=("elem1" "elem2" "elem3") 
if In_array "elem1" "${ARRAY[@]}"; then 
... 

上面的一個不錯而優雅的版本。