在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
我想知道这里的最佳做法是什么?
答案 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