Я просто ищу правильный и более элегантный способ написания следующего кода на 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

Основная идея заключается в том, что мне нужно проверить, являются ли 2 или более статических значения одновременно частью массива. Интересно, есть ли лучший способ сделать это, потому что, если мне нужно будет проверить больше 3-4 значений ... то, если строка if in_array станет огромной.

Любое предложение, пожалуйста?

Спасибо!

1 ответ1

3

Ну, операции с массивами в bash всегда ужасны, как показывает ваш собственный способ передачи массива в функцию.

Я бы преобразовал ваш тест в цикл for для аргументов, которые остаются после назначения массива:

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
}

так что вы можете проверить наличие всех значений в одном вызове функции:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .