Bash - 检查数组中的多个元素

Bash - 检查数组中的多个元素

我只是在寻找一种在 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

好吧,bash 中的数组操作总是很丑陋,正如您自己将数组传递给函数的方式所显示的那样。

我会将您的测试转换为对分配数组后剩余的参数进行循环:

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

相关内容