在 bash 中,如果我进行分配
a=
现在是什么情况a
?我确信 a 不是''
字符串,也不是0
。
我发现只有下面的测试是正确的
if [ $a = ];then echo 'good';fi
答案1
它是空字符串。
这与执行以下操作相同:
a=''
或者
a=""
或者
a=$''
或者对于这一点来说:
a=''""$''
这些''
、""
、 和$'...'
是对 shell 的引用运算符。当你这样做时:
a=''
您没有将由两个单引号字符组成的字符串分配给$a
空字符串。这些''
是多余的,因为它们内部没有任何内容,但这可以使您的代码稍微更清晰(更清楚地表明您确实打算分配一个空字符串)。
要将文字分配''
给$a
,您需要引用这些特殊字符,例如:
a="''" a=\'\' a=$'\'\'' a="'"\'
您的测试命令无效。在
[ $a = ]
由于您忘记引用$a
,因此 split+glob 运算符应用于$a
。由于$a
为空(但如果它仅包含默认值为 的空格或换行符,则结果是相同的$IFS
),导致没有参数传递给[
命令。
所以收到的所有参数[
都是[
,=
和]
。对于[
,这是一个测试来判断是否=
为非空字符串并且返回 true。
您想要的是将这些参数传递给[
命令:
[
$a
您需要的内容"$a"
=
- 空字符串。为此,您需要
''
或""
...不传递任何内容意味着没有传递任何参数,[
因此第四个参数将是结束参数]
。 ]
所以应该是:
if [ "$a" = '' ]; then echo '$a is empty'; fi
或者:
if [ -z "$a" ]; then echo '$a is empty'; fi
答案2
变量 a 等于空字符串。
a=
if [ "$a" -eq "" ]; then echo 'good'; fi
输出是:
$ . tst.sh
good
对于这段代码:
a=
if [ -z "$a" ]; then echo 'good'; fi
输出是一样的。