arr1 = (1 2 3); arr2 = $ {arr1 [@]} igual mas diferente

0

Eu faço essa matriz

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

Use a 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?

    
por JawSaw 02.11.2018 / 09:38

3 respostas

2

Existem algumas coisas que precisam ser corrigidas aqui.

  1. Quando você diz que faz arrays, arr1 e arr2 são iguais. Não, eles não são . A declaração de arr1 é válida, mas arr2 não é! É uma string. Fazer o abaixo atribui a saída da expansão de array de arr1 como uma string.

    arr2=${arr1[@]}
    declare -p arr2
    declare -- arr2="2 3 4"
    

    Para declará-lo como uma matriz, você precisa ter o (..) presente e citar a expansão da matriz de arr1 adequadamente para preservar a separação dos elementos.

    arr2=("${arr1[@]}")
    declare -p arr2
    declare -a arr2='([0]="2" [1]="3" [2]="4")'
    
  2. A iteração de uma matriz usando for i in $arr1; do echo $i; done is não funciona. É uma construção incorreta em bash , que de alguma forma é traduzida para ${arr1[0]} . A sintaxe certa a usar é

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

    O loop sobre arr2 está novamente incorreto. Você pode assumir que o loop é feito em uma matriz. Mas é uma string. Isso é feito em uma única string dividida por espaços. Você precisa primeiro converter arr2 para o formato de matriz apropriado e iterar como mencionei acima.

  3. A verificação de igualdade também está incorreta, pois if [[ $arr1==$arr2 ]] compara o comprimento da string diferente de zero, ou seja, todo o $arr1==$arr2 é tratado como uma string inteira por [[ operator e é por isso que você está vendo correspondência condição para isso. O mesmo poderia falhar se você tivesse usado o% básicotest operator [ . O caminho certo para comparar dois arrays seria iterar um sobre o outro e fazer uma correspondência de igualdade.

por 02.11.2018 / 10:02
1

O erro é sua condição:

[[ $arr1==$arr2 ]]

expandirá para:

[[ 1==1 2 3 ]]

que é equivalente a:

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

o que é verdade.

Observe também que, mesmo com a sintaxe correta:

[[ $arr1 == $arr2 ]]

essa condição compara o primeiro elemento da matriz arr1 , que é 1 , com a string arr2 , que é 1 2 3 .

    
por 02.11.2018 / 09:58
0

Eles não são iguais,

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

if [[ $arr1 == $arr2 ]];then ## Space is required here ( $arr1 == $arr2)
  echo yes 
fi
    
por 02.11.2018 / 10:00