每个应用程序都可以以相同或不同的方式自由解释未设置的变量和空变量。给它们赋予不同的含义通常是一个坏主意,大多数应用程序都不会这样做,但它确实发生了。
shell 本身的一个例子是IFS shell 变量(通常不在环境中导出,但适用相同的原则)。如果未设置,shell 的行为就像值是$' \t\n'.
在 shell 脚本中,$foo无论foo设置为空值还是未设置,都会扩展为空字符串。您可以在nounset设置 (set -u或set -o nounset)下运行 shell ,在这种情况下,如果您尝试扩展未设置的变量,shell 将报告错误并退出。否则,您可以使用参数扩展修饰符区分 unset 和空变量:${foo:+a}扩展为aiffoo未设置或为空,否则${foo+a}扩展为空字符串,而扩展为aeven iffoo设置为空字符串。
是的,有区别。但这非常微妙,因为评估空字符串和未设置的变量是相同的。
$ env - FOO= sh -c 'echo "X${FOO}X X${FOO:+x}X X${FOO+x}X"; env'
XX XX XxX
FOO=
PWD=/tmp
$ env - FOO= sh -c 'unset FOO; echo "X${FOO}X X${FOO:+x}X X${FOO+x}X"; env'
XX XX XX
PWD=/tmp
Run Code Online (Sandbox Code Playgroud)
两者的计算结果都${FOO:+x}为空字符串。但当${FOO+x}FOO 为空字符串时,将计算为“x”。
我经常使用它的一件事是设置一个$DEBUG环境变量,然后${DEBUG+true}在程序中使用。然后我可以将 DEBUG 设置为任何内容,包括空字符串。
在高级语言中,如 Perl 和 Python,这是“”和 undef (Perl) 或 None (Python) 之间的区别。