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

检查Array1长度是否等于Array2长度(bash),bash,Bash,在for循环中,我想找出:如果Array1length与Array2length匹配,那么breakfor循环 Shellcheck抛出错误(脚本运行正常时) 我还在学习bash,我的老师说“总是使用shell检查进行验证”,“总是将条件放在double[[]]中”和“永远不要使用*作为数组长度” 这些错误将随更正一起删除 if [ "${!Array1[*]}" == "${!Array2[*]}" ] ; then break; fi 我想知道这里的

在for循环中,我想找出:如果
Array1
length与
Array2
length匹配,那么
break
for循环

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

我还在学习bash,我的老师说“总是使用shell检查进行验证”,“总是将条件放在double[[]]中”和“永远不要使用*作为数组长度”

这些错误将随更正一起删除

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

我想知道这里的最佳实践是什么

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

因此,对于
${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[@]}"

结果:最终数组1长度:3 vs array2长度:3

如果您所说的长度是指元素数,
“${!array1[@]}”
是错误的。获取具有
“${数组[@]}”
的数组的长度(元素计数)。两个长度相等的非关联bash数组将具有相同的索引列表
0 1 2。。N
这通常是不正确的,因为使用的索引值可能存在差距,例如
declare-a='([0]=“a”[1]=“b”[10]=“c”)
其中
${a[@]}
的计算结果为3,
${a[@]}
0 1 10
#!/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[@]}"