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

また見なさい:

関連情報