초기화되지 않고 설정되지 않은 배열의 이상한 동작

초기화되지 않고 설정되지 않은 배열의 이상한 동작

저는 스크립트를 작성하고 있는데 초기화되지 않고 설정되지 않은 배열 변수의 예상치 못한 동작을 발견했는데 이해할 수 없습니다.

먼저 길이입니다.

$ echo ${#notset[@]}
0
$ uninitialized=
$ echo ${#uninitialized[@]}
1

uninitialized길이가 1입니까? 0이어야 하지 않나요? 빈 변수가 빈 요소의 배열로 처리되기 때문인가요?

이 사실은 몇 가지 문제를 야기합니다. 예를 들어 배열을 만들고 사용자 명령줄 매개변수에 따라 일정량의 콘텐츠를 삽입한다고 가정해 보겠습니다. (+) 처럼 하면 될 것 같아요 .

myarray=

if [ some-condition ]
then
    myarray[${#myarray[@]}]=some-value
fi

if [ some-condition2 ]
then
    myarray[${#myarray[@]}]=some-value2
elif [ some-condition3 ]
then
    myarray[${myarray[@]}]=some-value3
    myarray[${myarray[@]}]=some-value4
fi

하지만 이렇게 하면 첫 번째 슬롯이 비어 있어서 마음에 들지 않으며 배열에 요소가 포함되어 있는지 확인하려는 경우 내가 작성한 일부 코드 (*) 가 손상됩니다. 어떻게 해야 하나요?

[ -z "${myarray[@]}" ]

배열에 두 개 이상의 요소가 포함되어 있으면 오류가 발생합니다.

[ -z "$myarray" ]

배열이 비어 있지 않은 경우에도 첫 번째 요소가 비어 있기 때문에 실패합니다.

그렇다면 초기화되지 않은 배열을 어떻게 제어해야 합니까?

처리할 때 정확히 무슨 일이 일어나고 있는지 누군가 설명해 주실 수 있나요?정렬설정 해제 - 초기화되지 않은 변수?


(+) 변수를 "선언"하지 않아도 작동할 수 있다는 것을 알고 있지만 이 스크립트는 교수가 검토할 예정이며 교수는 변수가 임의의 위치에 정의되는 것을 좋아하지 않습니다.

(*) 이 작업을 하기 전에는 배열의 길이를 다른 변수에 저장해 두었기 때문에 문제가 없었습니다. 하지만 나는 이 보조 변수를 정의하지 않고 싶습니다. 왜냐하면 그것들 없이도 길이를 얻을 수 있다는 것을 알기 때문입니다.

답변1

다음과 같은 차이점을 확인할 수 있습니다 declare -p.

unset foo
declare -a foo
declare -p foo
# prints declare -a foo='()'
foo=
declare -p foo
# prints declare -a foo='([0]="")'

빈 배열을 초기화하려는 경우 첫 번째 출력은 declare -p배열을 선언하는 가장 좋은 방법에 대한 좋은 힌트입니다.

declare -a array='()'

(이 declare -a부분은 선택 사항일 수 있으며 단순 array=()해도 괜찮습니다.)

배열에 요소가 0개 있는지 테스트하려면 ${#array[@]}숫자 비교를 사용하세요. 확장 작업을 시도하지 마세요. test -z대부분의 경우 올바른 결과가 나오지 않습니다.

답변2

빈 배열을 초기화하려면 다음을 사용하세요.

array=()

배열에 값을 추가하려면 다음을 사용하십시오.

array+=(value)

관련 정보