Checking equality of arrays

Arrays and collections / Arrays

n1=(1 2 3)
n2=(1 2 3)
n3=(3 2 1)

#bash has no == for arrays: the elements are joined into strings
[[ "${n1[*]}" == "${n2[*]}" ]] && equal1=true || equal1=false
#equal1 is true
[[ "${n1[*]}" == "${n3[*]}" ]] && equal2=true || equal2=false
#equal2 is false

#joining loses the borders of the elements with spaces:
#("1" "2 3") and ("1 2" "3") both give "1 2 3";
#printf %q escapes the spaces inside an element
a=("1" "2 3")
b=("1 2" "3")
[[ "${a[*]}" == "${b[*]}" ]] && joinedEqual=true || joinedEqual=false
#joinedEqual is true
[[ $(printf '%q ' "${a[@]}") == $(printf '%q ' "${b[@]}") ]] && \
    quotedEqual=true || quotedEqual=false
#quotedEqual is false

#the same elements in any order: sort both and drop the repeats
sorted1=$(printf '%s\n' "${n1[@]}" | sort -u)
sorted3=$(printf '%s\n' "${n3[@]}" | sort -u)
[[ $sorted1 == "$sorted3" ]] && equal3=true || equal3=false
#equal3 is true

echo "equal1 is $equal1"
echo "equal2 is $equal2"
echo "joinedEqual is $joinedEqual"
echo "quotedEqual is $quotedEqual"
echo "equal3 is $equal3"