检查array1长度是否等于array2长度(bash)



在for循环中,我想找出:如果 Array1长度匹配 Array2长度,则 break for for循环。

shellCheck会引发错误(脚本运行良好时)

    if [[ "${!Array1[@]}" == "${!Array2[@]}" ]] ; then
            break;
    fi
^-- SC2199: Arrays implicitly concatenate in [[ ]]. Use a loop (or explicit * instead of @).

我仍在学习bash,我的老师说"总是用shellcheck验证",然后"始终将有条件的有条件放在双[[]]中,然后"永远不要使用 *阵列长度"

使用校正删除错误

    if [ "${!Array1[*]}" == "${!Array2[*]}" ] ; then
            break;
    fi

我想知道这里最好的做法是什么?

您的代码部分正确。问题是,您正在使用!操作员扩展数组的指示,而不是使用#操作员的长度。

因此,针对${array[@]}的两种用途都会发出有关隐式串联的警告,因为指示的列表为 0 1 2 3 ...。尽管如此,您的代码仍在工作,因为两个具有相等长度的非关联bash数组将具有相同的索引列表0 1 2 .. N

要摆脱警告,您应该用${#array[@]}替换${!array[@]}。当然,使用${!array[*]}也会抑制警告,但这绝对不是您想在这里做的,因为您将继续比较索引列表。

用于进一步阅读:ShellCheck的作者在此详细解释了串联问题。

nyronium的效果很好,并完美地解释了解决方案。

我还找到了一个解决方案,该解决方案可以检查该条件的数组长度。

对不起,我以前没有这个示例脚本,因为我以后写了它来测试逻辑。

示例

#!/bin/bash
array1=(1 2 3)
array2=()
echo "array1 length: ${#array1[@]}" #output :3
for i in {1..10} ; do
        echo "array2 length: ${#array2[@]}"
        array2+=("$i")
        #I want to exit when array2 = a length of 3
        if [[ "${#array1[@]}" == "${#array2[@]}" ]] ; then
                echo "exit"
                break
        fi
done
echo "final array1 length: ${#array1[@]} vs array2 length: ${#array1[@]}"

结果:最终array1长度:3 vs array2长度:3

最新更新