#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"