Bash 中的declare foo
和之间有什么区别?foo=
如果我打印出 的值,则和分别foo
是和。foo
foo=""
declare foo
foo=
foo
和的值foo=""
相等吗?如果不是,这些值怎么可能有所不同(两者-n
和-z
for 的[[ ... ]]
行为相同)?
$ 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.)或 [ "${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
也可以看看: