Bash의 와 Bash 의 declare foo
차이점은 무엇입니까 ?foo=
foo
, 및 의 값을 각각 인쇄하면 .foo
foo=""
declare foo
foo=
foo
와 값이 foo=""
같습니까? 그렇지 않다면 어떻게 이 값들이 다를 수 있습니까(둘 다 -n
와 동일하게 동작 -z
함 [[ ... ]]
)?
$ foo=
$ declare -p foo
declare -- foo=""
$ declare -p bar
bash: declare: bar: not found
$ declare bar
$ declare -p bar
declare -- bar
답변1
foo와 foo=""의 값이 같은가요? 그렇지 않다면 어떻게 이 값들 사이에 차이가 있을 수 있습니까?
아니요, 전자는 설정되지 않은 변수와 매우 유사합니다. declare -x foo
값을 설정하지 않고 변수에 대한 플래그를 설정하는 것과 같은 기능을 사용할 수 있습니다 . 예를 들어 foo
값을 얻은 경우 여기에서 내보낸 것으로 표시합니다. 당신이 그것의 용도를 찾을 수 있다면. (실제로 값이 없는 명령으로 내보내지는 않습니다.)
[[ -v name ]]
(Bash/ksh/etc.) 또는 (standard) 를 사용하여 [ "${var+set}" = set ]
설정되지 않은 변수와 설정되었지만 비어 있는 변수의 차이점을 알려줍니다.
$ unset foo
$ declare foo
$ declare -p foo
declare -- foo
$ [[ -v foo ]] && echo is set || echo not set
not set
$ echo ${foo+set}
$ unset foo
$ foo=
$ declare -p foo
declare -- foo=""
$ [[ -v foo ]] && echo is set || echo not set
is set
$ echo ${foo+set}
set
declare var
또한 함수 내에서 변수를 사용하면 함수에 로컬이 되는 반면 직접 할당은 그렇지 않으며 전역 변수에 할당됩니다.
$ foo=123
$ f() { declare foo; declare -p foo; }
$ f; declare -p foo
declare -- foo
declare -- foo="123"
$ g() { foo=; declare -p foo; }
$ g; declare -p foo
declare -- foo=""
declare -- foo=""
Bash를 넘어서 Ksh는 여기서 Bash와 매우 유사한 것으로 보이지만 Zsh에서는 foo=
차이가 없습니다 typeset foo
. 후자는 또한 변수를 빈 문자열로 설정합니다.
% unset foo; typeset foo; typeset -p foo; [[ -v foo ]] && echo is set || echo not set
typeset foo=''
is set
% unset foo; foo=; typeset -p foo; [[ -v foo ]] && echo is set || echo not set
typeset foo=''
is set
또한보십시오: