Bash - verifica vários elementos no array

0

Estou apenas procurando uma forma adequada e mais elegante de escrever o seguinte código no Bash:

in_array() {
local somearray=${1}[@]
local somevalue=${2}
for i in ${!somearray}; do
    if [[ ${i} == ${somevalue} ]]; then
        return 0
    fi
done
return 1
}

#declare array
declare -a myArray=(foo bar baz qux)

#defined values
val1=foo
val2=baz

#Ugly check if multiple strings are part of the array at the same time 
if in_array myArray $val1 && in_array myArray $val2; then
    # Do something #
else
    # Do something else#
fi

A idéia básica é que eu preciso verificar se 2 ou mais valores estáticos são, ao mesmo tempo, parte do array. Querendo saber se existe uma maneira melhor de fazer isso, porque se eu precisar verificar mais de 3-4 valores ... essa linha if in_array ficará enorme.

Alguma sugestão, por favor?

Obrigado!

    
por Marin Nedea 27.02.2018 / 13:53

1 resposta

3

Bem, operações de array no bash são sempre feias, como mostrado pelo seu próprio jeito de passar o array para a função.

Eu converteria seu teste em um loop for sobre os argumentos que permanecem após a atribuição da matriz:

in_array () {
    local somearray=${1}[@]
    shift
    for SEARCH_VALUE in "$@"; do
        FOUND=false
        for ARRAY_VALUE in ${!somearray}; do
            if [[ $ARRAY_VALUE == $SEARCH_VALUE ]]; then
                FOUND=true
                break
            fi
        done
        if ! $FOUND; then
            return 1
        fi
    done
    return 0
}

para que você possa verificar a presença de todos os valores em uma única chamada de função:

arr=(1 2 3 4 5)
in_array arr 1 # 0
in_array arr 1 2 # 0
in_array arr 1 6 # 1
in_array arr 1 2 3 4 5 # 0
    
por 27.02.2018 / 14:30

Tags