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
また見なさい: