在 bash 中,如果我进行分配
a=
Run Code Online (Sandbox Code Playgroud)
a
现在是什么?我确定 a 不是''
字符串,而不是0
.
我发现只有下面的测试是真的
if [ $a = ];then echo 'good';fi
Run Code Online (Sandbox Code Playgroud)
它是空字符串。
这与执行相同:
a=''
Run Code Online (Sandbox Code Playgroud)
或者
a=""
Run Code Online (Sandbox Code Playgroud)
或者
a=$''
Run Code Online (Sandbox Code Playgroud)
或者为此很重要:
a=''""$''
Run Code Online (Sandbox Code Playgroud)
那些''
, ""
, 和$'...'
将运算符引用到 shell。当你这样做时:
a=''
Run Code Online (Sandbox Code Playgroud)
您不是将由两个单引号字符组成的字符串分配给$a
空字符串。这些''
是多余的,因为它们里面什么都没有,但这可以使您的代码更清晰一些(更清楚地表明您确实打算分配一个空字符串)。
要将文字分配''
给$a
,您需要引用这些特殊字符,例如:
a="''" a=\'\' a=$'\'\'' a="'"\'
Run Code Online (Sandbox Code Playgroud)
您的测试命令无效。在
[ $a = ]
Run Code Online (Sandbox Code Playgroud)
由于您忘记引用$a
,因此将 split+glob 运算符应用于$a
。因为$a
是空的(但如果它只包含空格或默认值为 的换行符,则$IFS
结果相同)导致没有参数传递给[
命令。
所以[
接收到的所有参数都是[
,=
和]
。对于[
,这是一个判断是否=
为非空字符串并返回 true 的测试。
您在这里想要的是将这些参数传递给[
命令:
[
$a
您需要的内容"$a"
=
''
或""
......不传递任何内容意味着没有参数传递给[
所以第四个参数将是结束]
。]
所以应该是:
if [ "$a" = '' ]; then echo '$a is empty'; fi
Run Code Online (Sandbox Code Playgroud)
或者:
if [ -z "$a" ]; then echo '$a is empty'; fi
Run Code Online (Sandbox Code Playgroud)