
declare -a A
Bash에서 빈 배열을 생성 합니까 , 아니면 나중에 할당할 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
shows 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
에뮬레이션 을 제외한 에서 변수를 sh
사용 typeset
하면 해당 변수가 아직 설정되지 않았거나 설정되었지만 다른 유형(스칼라 대 배열 대 연관 배열)에서 온 경우 해당 변수를 선언하고 빈 값으로 설정합니다.