변수 확인 여부 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 -p
bash 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 --로 이동하세요.