我有一个bash数组“RUN_Arr”,其值如下所示。如果值相同,我希望脚本继续,否则我想报告它们。
echo "${RUN_Arr[@]}"
"AHVY37BCXY" "AHVY37BCXY" "AHVY37BCXY" "AHVY38BCXY" "AHVY37BCXY" "AHVY37BCXY"
基于上面的数组,我想回应一下:
No the array values are not same
"AHVY37BCXY" "AHVY38BCXY"
有人可以提出解决方案吗?感谢。
答案 0 :(得分:6)
遍历您的数组,并针对水印进行测试:
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 ..."
非常简单的概念证明;显然会因你的目的而变硬。
答案 1 :(得分:3)
如果您的数组元素都没有包含换行符,则可以执行以下操作:
mapfile -t uniq < <(printf "%s\n" "${RUN_Arr[@]}" | sort -u)
if (( ${#uniq[@]} > 1 )); then
echo "The elements are not the same: ${uniq[@]}"
# ...
如果您需要使用换行符保护元素,如果您有bash 4.4(对于-d
选项)和Gnu或FreeBSD排序(对于-z
选项),则有一个简单的解决方案:
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
如果没有bash 4.4,你可以使用@ hunteke的回答:
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
(这仍然需要支持-z
的排序。)