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. 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")'
    
  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 ]]0이 아닌 문자열 길이를 비교할 때 전체 $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

관련 정보