2011-05-02 2 views
9

배열에 지정된 요소가 있는지 여부를 테스트하는 방법이 있습니까?bash의 배열 연산자

예를 들어, 같은 : 트릭을 할 것입니다 루프

array=(one two three) 

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

답변

18

를했다.

array=(one two three) 

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

SO Frank에 오신 것을 환영합니다. 위대한 첫 번째 대답. – John

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 || 에코 미스가 충분하다 - wc-l과 -gt0는 매우 거친다. –

+1

테스트 ('[') 필요 없음. 그냥 grep의 반환 값을 사용하십시오. –

0

방금 ​​요소가 배열에 있는지 여부를 확인하려는 경우, 다른 방법

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

[이 답변] (http://stackoverflow.com/a/5853138/2533433)과 동일한 문제가 없습니까? 예 : '정직한'에코도 '찾았습니까?' 'foo = (정직한 oneman); echo "$ {foo [@]/one /}"'는''hst man'을 제공하므로 솔루션과 함께 "found"를 반환합니다. – Izzy

5

이 시도 :

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

배열이''array = (scone honest)' '가 아니라면' '요소' '를 포함 할 수는 없지만'= ~'연산자와 일치해야합니다. –

+0

@Jonathan oops, 네 말이 맞아. 그럼 [@ 프랭크의 대답] (http://stackoverflow.com/questions/5852446/in-array-operator-in-bash/5852473#5852473)에 투표합니다. – pepoluan

+0

이 문제를 * 일반적으로 해결하지는 않지만 대부분의 경우 각 배열 요소가 하나의 단어로만 구성된 경우 유용 할 수 있습니다. regexp (right-site)'= ~ "\ bone \ b" '전체 단어 만 일치시킵니다. 나는 단순함을 좋아한다! – Izzy

3

내의 .bashrc 파일의 기능을 '포함'을 가지고 :

:

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

그것은 배열 잘 작동 6,

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

그러나 배열이 필요하지 않습니다

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

가 (모두 -q-w 비표준 옵션은 grep을하는 것을 참고 :이 대한 GREP을 사용하여 좋아

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

-w을 전체 단어로만 작동하도록 지시하고 -q ("quiet")은 모든 출력을 억제합니다.

+0

요소가 단일 단어 (예제에있는 것처럼) 인 경우에만 작동합니다. 'array = ("one man" "two horses") 요소에서 "one"요소를 검사 할 때 잘못 사용하면 ("one"은 첫 번째 요소의 일부인 단어 *이므로) , 그것은 (독립적 인 요소로서) 아니지만. – Izzy

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 
... 

위의 멋지고 우아한 버전입니다.