Сравнение множеств

Массивы и коллекции / Множества

#true (exit code 0) if every key of the first set is in the second one
isSubsetOf() {
    local -n sub=$1 super=$2
    local key
    for key in "${!sub[@]}"; do
        [[ -v super[$key] ]] || return 1
    done
    return 0
}

#true if at least one key is in both sets
intersects() {
    local -n left=$1 right=$2
    local key
    for key in "${!left[@]}"; do
        [[ -v right[$key] ]] && return 0
    done
    return 1
}

#bash has no set: the keys of an associative array make one
declare -A first=([1]=1 [2]=1)
declare -A second=([2]=1 [1]=1)
declare -A third=([1]=1 [2]=1 [3]=1)

#equal sets: each one is a subset of the other
isSubsetOf first second && isSubsetOf second first && isEqual=true || \
    isEqual=false
#isEqual is true

intersects first third && isIntersects=true || isIntersects=false
#isIntersects is true

isSubsetOf third first && isSubset1=true || isSubset1=false
#isSubset1 is false
isSubsetOf first third && isSubset2=true || isSubset2=false
#isSubset2 is true

echo "isEqual is $isEqual"
echo "isIntersects is $isIntersects"
echo "isSubset1 is $isSubset1"
echo "isSubset2 is $isSubset2"