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 字符串):bash
zsh
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
,如果您从声明了该变量的另一个函数调用的函数中执行此操作,mksh
则yash
whereunset
可能会从外部作用域显示 的版本,而不是取消设置它$var
当地的),$var
没有值,无论是否为 null。
但是,除非打开$var
该选项,否则仍然会扩展为空(空字符串) 。nounset
未设置的变量和分配空值的变量之间还有其他区别:
${var?}
$var
未设置时触发错误${var+x}
扩展为x
if$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
因此将变量设置为""
与将其设置为空值相同。因此,空值和""
是相同的。