Bash에서 `declare foo`와 `foo=`의 차이점은 무엇입니까?

Bash에서 `declare foo`와 `foo=`의 차이점은 무엇입니까?

Bash의 와 Bash 의 declare foo차이점은 무엇입니까 ?foo=

foo, 및 의 값을 각각 인쇄하면 .foofoo=""declare foofoo=

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

또한보십시오:

관련 정보