Reputation: 561
I have a bash array "RUN_Arr" with values as given below. If the values are same, I want the script to continue else I want to report them.
echo "${RUN_Arr[@]}"
"AHVY37BCXY" "AHVY37BCXY" "AHVY37BCXY" "AHVY38BCXY" "AHVY37BCXY" "AHVY37BCXY"
Based on the above array, I want to echo:
No the array values are not same
"AHVY37BCXY" "AHVY38BCXY"
Can someone suggest a solution? Thanks.
Upvotes: 4
Views: 4899
Reputation: 241701
If none of your array elements includes a newline character, you can do this:
mapfile -t uniq < <(printf "%s\n" "${RUN_Arr[@]}" | sort -u)
if (( ${#uniq[@]} > 1 )); then
echo "The elements are not the same: ${uniq[@]}"
# ...
If you need to protect against elements with newline characters, there is a simple solution if you have bash 4.4 (for the -d
option) and Gnu or FreeBSD sort (for the -z
option):
mapfile -d '' -t uniq < <(printf "%s\n" "${RUN_Arr[@]}" | sort -zu)
if (( ${#uniq[@]} > 1 )); then
echo "The elements are not the same: ${uniq[@]}"
exit 1
fi
Without bash 4.4, you could use an adaptation of @hunteke's answer:
for i in "${RUN_Arr[@]:1}"; do
if [[ $i != ${RUN_ARR[0]} ]]; then
printf "The elements are not the same:"
printf "%s\0" "${RUN_Arr[@]}" |
sort -zu |
xargs -0 printf " %s"
printf "\n"
exit 1
fi
done
(This still requires a sort which supports -z
.)
Upvotes: 4
Reputation: 3716
Iterate through your array, and test against a watermark:
arr=(a a a b a a a)
watermark=${arr[0]}
for i in "${arr[@]}"; do
if [[ "$watermark" != "$i" ]]; then
not_equal=true
break
fi
done
[[ -n "$not_equal" ]] && echo "They are not equal ..."
Very simplistic Proof-Of-Concept for you; obviously harden as appropriate for your purposes.
Upvotes: 8