![초기화되지 않고 설정되지 않은 배열의 이상한 동작](https://linux55.com/image/26897/%EC%B4%88%EA%B8%B0%ED%99%94%EB%90%98%EC%A7%80%20%EC%95%8A%EA%B3%A0%20%EC%84%A4%EC%A0%95%EB%90%98%EC%A7%80%20%EC%95%8A%EC%9D%80%20%EB%B0%B0%EC%97%B4%EC%9D%98%20%EC%9D%B4%EC%83%81%ED%95%9C%20%EB%8F%99%EC%9E%91.png)
저는 스크립트를 작성하고 있는데 초기화되지 않고 설정되지 않은 배열 변수의 예상치 못한 동작을 발견했는데 이해할 수 없습니다.
먼저 길이입니다.
$ 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)