![arr1=(1 2 3) ; arr2=${arr1[@]} 같지만 다릅니다.](https://linux55.com/image/141475/arr1%3D(1%202%203)%20%3B%20arr2%3D%24%7Barr1%5B%40%5D%7D%20%EA%B0%99%EC%A7%80%EB%A7%8C%20%EB%8B%A4%EB%A6%85%EB%8B%88%EB%8B%A4..png)
이렇게 배열을 만들었어요
$ 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
여기서 수정해야 할 몇 가지 사항이 있습니다.
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")'
is를 사용하면 배열을 반복하는 것이
for i in $arr1; do echo $i; done
작동하지 않습니다. 이는 의 잘못된 구성이므로bash
어떻게든 로 변환됩니다${arr1[0]}
. 사용할 올바른 구문은 다음과 같습니다.for i in "${arr1[@]}"; do echo "$i"; done
루프가
arr2
또 올바르지 않습니다. 루프가 배열에서 수행된다고 가정할 수 있습니다. 하지만 그것은 문자열입니다. 이는 공백으로 구분된 단일 문자열에서 수행됩니다. 먼저arr2
올바른 배열 형식으로 변환하고 위에서 언급한 대로 반복 해야 합니다 .if [[ $arr1==$arr2 ]]
0이 아닌 문자열 길이를 비교할 때 전체$arr1==$arr2
연산자가 이를 완전한 문자열로 취급하므로 동등성 검사도 올바르지 않습니다[[
. 이것이 바로 긍정적인 조건부 일치가 표시되는 이유입니다. 기본test
연산자를 사용하는 경우에도 마찬가지입니다[
. 두 배열을 비교하는 올바른 방법은 하나의 배열을 반복하고 동일한지 일치시키는 것입니다.
답변2
오류는 귀하의 상태입니다:
[[ $arr1==$arr2 ]]
다음으로 확장 예정:
[[ 1==1 2 3 ]]
다음과 동일:
[[ -n 1==1 2 3 ]]
이것은 진짜입니다.
또한 올바른 구문을 사용하더라도 다음 사항에 유의하세요.
[[ $arr1 == $arr2 ]]
이 조건은 배열 arr1
의 첫 번째 요소를 문자열과 1
비교합니다 .arr2
1 2 3
답변3
그들은 동등하지 않습니다.
arr1=(1 2 3)
arr2=${arr1[@]}
if [[ $arr1 == $arr2 ]];then ## Space is required here ( $arr1 == $arr2)
echo yes
fi