【问题标题】:Check if bash array values are all same检查 bash 数组值是否都相同
【发布时间】:2018-03-31 22:54:52
【问题描述】:

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

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

基于上面的数组,我要回显:

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

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

【问题讨论】:

    标签: arrays linux bash unix sh


    【解决方案1】:

    遍历您的数组,并针对 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 ..."
    

    非常简单的概念证明;显然根据您的目的硬化。

    【讨论】:

    • 感谢您的回复,我也在考虑同样的方法。我想知道是否有一个函数可以获取数组中的唯一元素,如果有,我可以报告唯一元素的数量是否超过一个。
    • 本身没有这样的功能,但这并不意味着您不能为自己编写一个。我可能会使用 Awk、外包给不同的语言或 Bash 的哈希表。查看How to define hash tables in Bash?
    【解决方案2】:

    如果您的数组元素都不包含换行符,您可以这样做:

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

    【讨论】:

    • 谢谢 Rici,这很有帮助。
    猜你喜欢
    • 2016-02-13
    • 1970-01-01
    • 2014-05-15
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    相关资源
    最近更新 更多