`declare -p`는 변수(배열 변수 포함)가 설정되었는지 확인합니까?

`declare -p`는 변수(배열 변수 포함)가 설정되었는지 확인합니까?

변수 확인 여부 declare -p(포함배열 변수)이 설정되어 있습니까?

배열 변수와 배열이 아닌 변수가 다르게 동작하는 이유는 무엇입니까?

배열 변수의 경우:

$ unset ar
$ declare -a ar=()
$ declare -p ar
declare -a ar='()'
$ echo ${ar[@]-This is a new value}
This is a new value

그리고

$ unset ar
$ declare -a ar
$ declare -p ar
bash: declare: ar: not found
$ echo ${ar[@]-This is a new value}
This is a new value

배열이 아닌 변수의 경우:

$ unset var
$ declare -i var
$ declare -p var
bash: declare: var: not found
$ echo ${var-This is a new value}
This is a new value

감사해요.


저는 Bash 4.3.48을 실행하고 있습니다.

~에서https://unix.stackexchange.com/a/381491/674unset ar, 4.4에서는 실행 및 실행 후의 declare -a ar출력이 declare -p var이라고 들었습니다 declare -a ar.

declare -pbash 4.4에 있는지 궁금합니다 . 배열은 다른 유형과 다르게 처리됩니다. 4.4에서 running unset var및 after running declare -i var의 출력은 무엇입니까 declare -p var? 출력 error such as bash: declare: var: not found되나요 declare -i var?

답변1

list 가 제공되면 모든 bash 버전은 배열을 올바르게 처리합니다 ().
또는 배열 요소에 값(비어 있는 경우라도)을 제공합니다.
이 코드(ksh에서 실행되도록 조판 사용):

unset ar; typeset -a ar=()
printf '%-20s%s ' "$(typeset -p ar)" '--'

unset ar; typeset -a ar; ar[3]=""
printf '%-30s%s ' "$(typeset -p ar)" '@@'

unset ar; typeset -a ar; ar[3]="val"
printf '%-31s ' "$(typeset -p ar)"

다음 결과를 인쇄합니다.

zsh/sh          : typeset -a ar=(  )  -- typeset -a ar=( '' '' '' '' ) @@ typeset -a ar=( '' '' '' val )
b203sh          : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b204sh          : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b205sh          : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b30sh           : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b32sh           : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b41sh           : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b42sh           : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b43sh           : declare -a ar='()'  -- declare -a ar='([3]="")'      @@ declare -a ar='([3]="val")'
b44sh           : declare -a ar=()    -- declare -a ar=([3]="")        @@ declare -a ar=([3]="val")
ksh93           : typeset -a ar       -- typeset -a ar=([3]='')        @@ typeset -a ar=([3]=val)
attsh           : typeset -a ar       -- typeset -a ar=([3]='')        @@ typeset -a ar=([3]=val)
zsh/ksh         : typeset -a ar=(  )  -- typeset -a ar=( '' '' '' '' ) @@ typeset -a ar=( '' '' '' val )
zsh             : typeset -a ar=(  )  -- typeset -a ar=( '' '' '' )    @@ typeset -a ar=( '' '' val )

보시다시피, 모든 쉘(약간의 차이점은 있음)은 코드를 실행하고 동일한 결과를 제공합니다.


또한 모든 쉘은 다음 코드를 사용할 수 있습니다.

unset ar; typeset -i ar              ; printf '%-17s%s ' "$(typeset -p ar)" '=='
unset ar; typeset -a ar              ; printf '%-19s%s ' "$(typeset -p ar)" '++'

그리고 인쇄하세요:

zsh/sh          : typeset -i ar=0  == typeset -a ar=(  ) ++
b203sh          : declare -i ar="" == declare -a ar='()' ++
b204sh          : declare -i ar="" == declare -a ar='()' ++
b205sh          : declare -i ar="" == declare -a ar='()' ++
b30sh           : declare -i ar="" == declare -a ar='()' ++
b32sh           : declare -i ar="" == declare -a ar='()' ++
b44sh           : declare -i ar    == declare -a ar      ++
ksh93           : typeset -i ar    == typeset -a ar      ++
attsh           : typeset -i ar    == typeset -a ar      ++
zsh/ksh         : typeset -i ar=0  == typeset -a ar=(  ) ++
zsh             : typeset -i ar=0  == typeset -a ar=(  ) ++

대략적인 패치는 bash 시리즈 4에 있습니다. 4.1과 4.2 모두 어레이에 적용됩니다.

b41sh           : declare -a ar='()' ++
b42sh           : declare -a ar='()' ++

하지만 단순 변수에는 작동하지 않습니다. bash 4.3은 두 테스트 모두에서 실패합니다.

b43sh           : script: line 3: typeset: ar: not found ==
                  script: line 4: typeset: ar: not found ++

따라서 이 테스트를 위해 Bash 4.3 --로 이동하세요.

관련 정보