Bash에서 선언할 때 모든 변수가 데이터 유형별 기본값으로 초기화되지 않는 이유는 무엇입니까?

Bash에서 선언할 때 모든 변수가 데이터 유형별 기본값으로 초기화되지 않는 이유는 무엇입니까?

Bash 버전 "GNU bash, 버전 4.1.10(4)-release (i686-pc-cygwin)"에서 다음 코드를 실행하면 다음과 같은 결과가 나타납니다.

declare a
declare -p a
# Output: -bash: declare: a: not found
declare -i b
declare -p b
# Output: -bash: declare: b: not found
declare -a c
declare -p c
# Output: declare -a c='()'
declare -A d
declare -p d
# Output: declare -A d='()'

말하자면, 위의 변수는 모든 경우에 초기화되어야 하거나 어떤 경우에도 초기화되지 않아야 한다고 생각합니다. 이는 선언 시 배열을 초기화하는 것보다 더 일관성이 있는 것 같습니다.

답변1

나는 다음과 같이 변수를 항상 안전하고 균일하게 선언하고 초기화할 수 있다고 생각합니다.

declare a=""
declare -p a
# Output: declare -- a=""
declare -i b=0
declare -p b
# Output: declare -i b="0"
declare -a c=()
declare -p c
# Output: declare -a c='()'
declare -A d=()
declare -p d
# Output: declare -A d='()'

Bash 셸의 서로 다른 버전 간에는 서로 다른 동작이 있는 것으로 보입니다.

변수를 선언할 때 명시적인 초기화 값을 제공하지 않으면 로컬 변수를 사용하는 다음 예제와 같이 결과가 예상되지 않을 수 있습니다.

function foobar {
  declare a
  declare -i b
  declare -a c
  declare -A d
  declare -p a b c d
  a=a
  b=42
  c+=(c)
  d+=([d]=42)
  declare -p a b c d
}
foobar
# Output:
# declare -- a=""
# declare -i b=""
# declare -a c='()'
# declare -A d='()'
# Output:
# declare -- a="a"
# declare -i b="42"
# declare -a c='([0]="c")'
# declare -A d='([d]="42" )'
declare -p a b c d
# Output:
# bash: declare: a: not found
# bash: declare: b: not found
# bash: declare: c: not found
# bash: declare: d: not found

지역 변수 및 늦은 초기화의 경우 모든 것이 예상대로 작동합니다. 특히 함수 declare -p a b c d내의 첫 번째 항목 은 foobar모든 변수가 데이터 유형별 기본값으로 초기화되었음을 보고합니다. 이를 전역 변수의 경우와 비교해 보세요. 여기서 a및 변수는 각각 및 b로 보고됩니다 .-bash: declare: a: not found-bash: declare: b: not found

관련 정보