我做了一个这样的数组
$ arr1=(1 2 3) ; arr2=${arr1[@]}
使用迭代来检查它们
$ for i in $arr1; do echo $i; done
1
$ for i in $arr2; do echo $i; done
1
2
3
他们是平等的
$ if [[ $arr1==$arr2 ]];then echo yes ;fi
yes
我该如何理解这种情况呢?
答案1
这里有一些事情需要修复。
当你说你制作数组时
arr1
,arr2
它们是相同的。不,是他们不是。声明arr1
有效但arr2
无效!它是一个字符串。执行以下操作将数组扩展的输出指定为arr1
字符串。arr2=${arr1[@]} declare -p arr2 declare -- arr2="2 3 4"
要将其声明为数组,您需要正确引用
(..)
当前的数组扩展arr1
以保持元素的分隔。arr2=("${arr1[@]}") declare -p arr2 declare -a arr2='([0]="2" [1]="3" [2]="4")'
使用 is 迭代数组
for i in $arr1; do echo $i; done
是行不通的。这是 中的一个不正确的构造bash
,它以某种方式转换为${arr1[0]}
.正确使用的语法是for i in "${arr1[@]}"; do echo "$i"; done
循环
arr2
又不正确。您可以假设循环是在数组上完成的。但它是一个字符串。它是在由空格分隔的单个字符串上完成的。您需要首先转换arr2
为正确的数组格式并按照我上面提到的进行迭代。相等性检查也是不正确的,因为
if [[ $arr1==$arr2 ]]
比较非零字符串长度,即整个$arr1==$arr2
被运算符视为一个完整字符串[[
,这就是为什么您会看到它的正条件匹配。如果您使用基本test
运算符,同样会失败[
。比较两个数组的正确方法是迭代一个数组并进行相等匹配。
答案2
错误是你的条件:
[[ $arr1==$arr2 ]]
将扩展到:
[[ 1==1 2 3 ]]
相当于:
[[ -n 1==1 2 3 ]]
这是真的。
另请注意,即使使用正确的语法:
[[ $arr1 == $arr2 ]]
该条件将数组arr1
的第一个元素1
与字符串进行比较。arr2
1 2 3
答案3
他们不平等,
arr1=(1 2 3)
arr2=${arr1[@]}
if [[ $arr1 == $arr2 ]];then ## Space is required here ( $arr1 == $arr2)
echo yes
fi