空字符串和“”是同一个字符串吗?

空字符串和“”是同一个字符串吗?

Bash 手册说:

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

...

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

空字符串与 相同吗""

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

答案1

是的,在该上下文中,空字符串是长度为 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`"

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

var=$'\0'
var=$'\u0000'
var=$'\c@'
var=$'\x00'
var=$'\0\0\0\0\0'

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

之后unset var(但要注意 , 的错误/错误功能bash,如果您从声明了该变量的另一个函数调用的函数中执行此操作,mkshyashwhereunset可能会从外部作用域显示 的版本,而不是取消设置它$var当地的),$var没有值,无论是否为 null。

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

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

答案2

是的。使用来自的测试这个答案:

$ [ -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

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

相关内容