arr1=(1 2 3) ; arr2=${arr1[@]} 相等但不同

arr1=(1 2 3) ; arr2=${arr1[@]} 相等但不同

我做了一个这样的数组

$ 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

这里有一些事情需要修复。

  1. 当你说你制作数组时arr1arr2它们是相同的。不,是他们不是。声明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")'
    
  2. 使用 is 迭代数组for i in $arr1; do echo $i; done是行不通的。这是 中的一个不正确的构造bash,它以某种方式转换为${arr1[0]}.正确使用的语法是

    for i in "${arr1[@]}"; do echo "$i"; done
    

    循环arr2又不正确。您可以假设循环是在数组上完成的。但它是一个字符串。它是在由空格分隔的单个字符串上完成的。您需要首先转换arr2为正确的数组格式并按照我上面提到的进行迭代。

  3. 相等性检查也是不正确的,因为if [[ $arr1==$arr2 ]]比较非零字符串长度,即整个$arr1==$arr2被运算符视为一个完整字符串[[,这就是为什么您会看到它的正条件匹配。如果您使用基本test运算符,同样会失败[。比较两个数组的正确方法是迭代一个数组并进行相等匹配。

答案2

错误是你的条件:

[[ $arr1==$arr2 ]]

将扩展到:

[[ 1==1 2 3 ]]

相当于:

[[ -n 1==1 2 3 ]]

这是真的。


另请注意,即使使用正确的语法:

[[ $arr1 == $arr2 ]]

该条件将数组arr1的第一个元素1与字符串进行比较。arr21 2 3

答案3

他们不平等,

arr1=(1 2 3)
arr2=${arr1[@]}

if [[ $arr1 == $arr2 ]];then ## Space is required here ( $arr1 == $arr2)
  echo yes 
fi

相关内容