空字符串和 "" 是同一个字符串吗?

Tim*_*Tim 14 bash

Bash手册说:

如果一个参数已被赋值,则该参数被设置。空字符串是有效值。

...

如果未给出值,则为变量分配空字符串。

空字符串是否与""?

它们的长度都为零吗?是否可以通过条件表达式-z-n哪个测试字符串的长度是零还是非零来测试两者?

Sté*_*las 16

是的,该上下文中的空字符串是长度为 0 的字符串,根本不包含字节。在bash

var=
var=''
var=""
var=$''
var=$""
var=$(true) # or any command that outputs nothing or only newline
            # characters
var=`true`
var=${null_or_unset_var}
var=''""$''$""$(true)"`true`"
Run Code Online (Sandbox Code Playgroud)

但也在 中bash,作为bash(与 相反zsh)在其变量中不支持 NUL 字节的副作用(因为它在内部使用以 NUL 分隔的 C 字符串):

var=$'\0'
var=$'\u0000'
var=$'\c@'
var=$'\x00'
var=$'\0\0\0\0\0'
Run Code Online (Sandbox Code Playgroud)

在所有这些情况下,$var将被设置但不包含任何内容(空字符串)。echo "${#var}"将输出0[ -z "$var" ]将返回 true 并且不printf %s "$var"输出任何内容。

之后unset var(但要注意的错误/不良特性的bashmksh并且yash在那里unset可以揭示一个版本的$var外部范围,而不是它解封,如果你正在做的是从从已声明的变量另一个函数调用的函数地方),$var没有价值,是否为空。

然而,$var除非nounset选项打开,否则仍然扩展为空(到空字符串)。未设置变量和分配了空值的变量之间还有其他区别:

  • ${var?}$var未设置时触发错误
  • ${var+x}扩展为xif$var有任何值(甚至为空)
  • ${var-x}扩展为xif$var未设置
  • [[ -v var ]]如果$var未设置,则返回 false
  • 如果变量被标记为 for export,则var=在每个命令的环境中传递(如果已设置),否则根本不传递。


Ale*_*hev 15

是的。使用此答案中的测试:

$ [ -n "${a+1}" ] && echo "defined" || echo "not defined"
not defined
$ a=""
$ [ -n "${a+1}" ] && echo "defined" || echo "not defined"
defined
$ b=
$ [ -n "${b+1}" ] && echo "defined" || echo "not defined"
defined
Run Code Online (Sandbox Code Playgroud)

因此,将变量设置""为与将其设置为空值相同。因此,空值和""是一样的。