bash에서 declare -a A
빈 배열을 생성 합니까, 아니면 나중에 할당될 A
경우를 대비해 속성을 설정합니까 ?A
다음 코드를 고려해보세요:
set -u
declare -a A
echo ${#A[*]}
echo ${A[*]}
A=()
echo ${#A[*]}
echo ${A[*]}
A=(1 2)
echo ${#A[*]}
echo ${A[*]}
예상되는 출력은 무엇입니까?
Bash 4.3.48(1)에서 bash: A: unbound variable
이후 요소 수를 쿼리하면 declare
. 모든 요소에 액세스할 때도 이 오류가 발생합니다. Bash의 이후 버전에서는 이를 다르게 처리한다는 것을 알고 있습니다. 난 아직도 그게 declare
사실인지 알고 싶어정의변수(비어 있음).
답변1
이는 해당 변수가 현재 범위(전역 또는 현재 함수라고도 하는 최상위 수준)에서 선언되었는지 여부에 따라 달라집니다.
현재 범위에서 선언되지 않은 경우(최상위 범위에서는 변수가발표하다(환경에서 가져와서 할당) 그런 다음 선언하고(함수 범위에서 함수에 로컬로 만들기) 유형을 할당하지만 초기화하지 마세요. 심지어 빈 목록에도 초기화하지 마세요( declare -p a
표시됨 declare -a a
, 아님 declare -a a=()
) 으로 선언 및/또는 할당하는 것과 같습니다 a=()
.
현재 범위에서 이미 선언된 경우(예: 전역 범위의 환경에서 스칼라 변수로 가져왔기 때문에) declare -a a
시도됩니다 .변화배열로 변환합니다.
이전에 스칼라였다면 ([0]=value-of-the-variable)
배열이 됩니다. 이미 배열인 경우 변경되지 않은 상태로 유지됩니다. 연관 배열인 경우 cannot convert associative to indexed array
오류와 함께 실패합니다.
이는 declare a
배열이나 해시를 스칼라로 변환하지 않는다는 점에 유의하세요. bash
어쨌든 해시/배열을 스칼라로 변환할 수 있는 방법은 없습니다. 강제 스칼라를 사용할 수 있습니다 declare +aA a
(변수가 이전에 현재 범위의 해시/배열이었던 경우 오류와 함께 실패합니다).
귀하의 경우 변수가 현재 범위에서 선언되지 않았을 수 있으므로 결국 선언은 되지만 할당되지 않습니다. 이는 set -u
.
둘 사이의 차이점발표하다그리고분산/놓다변수의 상태는 에만 국한되지 않습니다 bash
. POSIX에서는 변수를 생성하거나 할당되지 않은 상태로 둘 sh
수도 있습니다 .export
readonly
$ sh -uc 'unset -v var; readonly var; : "$var"'
sh: 1: var: parameter not set
변수 는 unset
설정되지 않고 선언되지 않습니다. 에서는 외부 범위에서 변수를 복원할 수 있습니다 bash
.mksh
yash
조롱 외에도 변수에 대한 사용이 선언되고 zsh
변수가 설정되지 않았거나 설정되었지만 다른 유형(스칼라, 배열 또는 연관 배열)에 속해 있는 경우 null로 설정됩니다.sh
typeset