Bash:赋值`a=`定义了什么?

Bash:赋值`a=`定义了什么?

在 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。

您想要的是将这些参数传递给[命令:

  1. [
  2. $a您需要的内容"$a"
  3. =
  4. 空字符串。为此,您需要''""...不传递任何内容意味着没有传递任何参数,[因此第四个参数将是结束参数]
  5. ]

所以应该是:

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

输出是一样的。

相关内容