我做了这样一个数组
$ 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
我该如何理解这种情况?
我做了这样一个数组
$ 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
我该如何理解这种情况?
错误是你的情况:
将扩展为:
相当于:
这是真的。
另请注意,即使使用正确的语法:
该条件将数组的第一个元素
arr1
,1
与字符串arr2
, 进行比较1 2 3
。这里需要修复的东西很少。
当你说你制作数组
arr1
时arr2
是一样的。不,他们不是。的声明arr1
有效但arr2
无效!它是一个字符串。执行以下操作将数组扩展的输出分配arr1
为字符串。要将其声明为数组,您需要正确地
(..)
呈现并引用数组扩展arr1
以保持元素的分离。使用 is 遍历数组
for i in $arr1; do echo $i; done
是行不通的。它是 中的错误构造bash
,它以某种方式转换为${arr1[0]}
. 正确的语法是循环
arr2
再次不正确。您可以假设循环是在一个数组上完成的。但它是一个字符串。它是在由空格分隔的单个字符串上完成的。您需要首先转换arr2
为正确的数组格式并像我上面提到的那样进行迭代。相等性检查也不正确,因为
if [[ $arr1==$arr2 ]]
比较的是非零字符串长度,即整个 of$arr1==$arr2
被运算符视为一个完整的字符串[[
,这就是为什么您会看到它的肯定条件匹配。test
如果您使用了基本运算符,同样会失败[
。比较两个数组的正确方法是迭代一个数组并进行相等匹配。他们不平等,