Bash 中的 `declare foo` 和 `foo=` 有什么区别?

Bash 中的 `declare foo` 和 `foo=` 有什么区别?

Bash 中的declare foo和之间有什么区别?foo=

如果我打印出 的值,则和分别foo是和。foofoo=""declare foofoo=

foo和的值foo=""相等吗?如果不是,这些值怎么可能有所不同(两者-n-zfor 的[[ ... ]]行为相同)?

$ 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

也可以看看:

相关内容