检查Array1长度是否等于Array2长度(bash)

时间:2017-09-25 07:31:04

标签: bash

在for循环中,我希望找出:如果Array1长度与Array2长度相匹配,那么break for循环。

Shellcheck抛出错误(脚本运行正常)

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

^-- SC2199: Arrays implicitly concatenate in [[ ]]. Use a loop (or explicit * instead of @).

我还在学习bash,而我的老师说"总是用Shellcheck验证"并且总是将条件放在double [[]]"并且从不使用*作为数组长度"

使用更正

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

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

2 个答案:

答案 0 :(得分:1)

您的代码部分正确无误。问题是,您使用!运算符扩展数组的指标,而不是使用#运算符来扩展数组的长度。

因此,对${array[@]}的两种用法都发出了关于隐式连接的警告,因为标记列表为0 1 2 3 ...。然而,您的代码正在运行,因为两个长度相等的非关联bash数组将具有相同的索引列表0 1 2 .. N

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

进一步阅读:shellcheck的作者解释了连接问题here in detail

答案 1 :(得分:0)

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[@]}"

结果:final array1 length:3 vs array2 length:3