eu faço tal matriz
$ arr1=(1 2 3) ; arr2=${arr1[@]}
Use iteração para verificá-los
$ for i in $arr1; do echo $i; done
1
$ for i in $arr2; do echo $i; done
1
2
3
Eles são iguais
$ if [[ $arr1==$arr2 ]];then echo yes ;fi
yes
Como devo entender essa situação?
O erro é sua condição:
se expandirá para:
que equivale a:
que é verdade.
Observe também que, mesmo com a sintaxe correta:
essa condição compara o primeiro elemento de array
arr1
que é1
, com a stringarr2
, que é1 2 3
.Há algumas coisas que precisam ser corrigidas aqui.
Quando você diz que faz arrays
arr1
earr2
são iguais. Não, eles não são . A declaração dearr1
é válida, masarr2
não é! É uma corda. Fazendo o abaixo atribui a saída da expansão da matrizarr1
como uma string.Para declará-lo como um array você precisa ter o
(..)
presente e citar a expansão do arrayarr1
corretamente para preservar a separação dos elementos.Iterar sobre um array usando
for i in $arr1; do echo $i; done
is não funciona. É uma construção incorreta embash
, que de alguma forma está traduzindo para${arr1[0]}
. A sintaxe correta a ser usada éO loop over
arr2
está novamente incorreto. Você pode assumir que o loop é feito em uma matriz. Mas é uma corda. Isso é feito em uma única string que é dividida por espaços. Você precisa primeiro converterarr2
para o formato de matriz adequado e iterar como mencionei acima.A verificação de igualdade também está incorreta, pois
if [[ $arr1==$arr2 ]]
compara para comprimento de string diferente de zero, ou seja, o todo$arr1==$arr2
é tratado como uma string inteira pelo[[
operador e é por isso que você está vendo uma correspondência de condição positiva para ele. O mesmo falharia se você tivesse usado otest
operador básico[
. A maneira correta de comparar duas matrizes seria iterar uma sobre a outra e fazer uma correspondência de igualdade.Não são iguais,