检查bash数组值是否完全相同

时间:2017-10-19 19:45:20

标签: arrays linux bash unix sh

我有一个bash数组“RUN_Arr”,其值如下所示。如果值相同,我希望脚本继续,否则我想报告它们。

echo "${RUN_Arr[@]}"
"AHVY37BCXY" "AHVY37BCXY" "AHVY37BCXY" "AHVY38BCXY" "AHVY37BCXY" "AHVY37BCXY"

基于上面的数组,我想回应一下:

 No the array values are not same
 "AHVY37BCXY" "AHVY38BCXY"

有人可以提出解决方案吗?感谢。

2 个答案:

答案 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的排序。)