2017-09-25 71 views
2

在for循环中,我正在查找:如果Array1长度匹配Array2长度然后break for循环。检查Array1长度是否等于Array2长度(bash)

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

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

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

我还在学习bash和我的老师说:“与Shellcheck始终验证”和“始终把双[[]]条件语句“和‘从不使用*数组长度’

错误(S)与校正

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

我想知道什么是最好的做法在这里被删除?

+0

如果长度你指元件的数量,' “{!数组1 [@]} $”'是错误。 – Cyrus

+0

用'“$ {#array [@]}”获取数组的长度(元素个数)。 – Leon

回答

1

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

因此,针对两个用途${array[@]}发出关于隐式级联的警告,因为指示列表是0 1 2 3 ...。不过,你的代码正在工作,因为两个长度相等的非关联bash数组将具有相同的索引列表0 1 2 .. N

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

欲了解更多信息:shellcheck的作者已经解释了连接问题here in detail

+0

*具有相等长度的两个非关联bash数组将具有相同的索引列表'0 1 2 .. N' *这通常是不正确的,因为所使用的索引值可能存在间隙。 '$ {#a [@]}'计算结果为3,'$ {'='([0] =“a”[1] =“b”[10] =“c” #a [@]}'是'0 1 10'。 – Leon

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

结果:最终ARRAY1长度:3比数组2长度:3