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

use*_*964 0 bash

在 bash 中,如果我进行分配

a=
Run Code Online (Sandbox Code Playgroud)

a现在是什么?我确定 a 不是''字符串,而不是0.

我发现只有下面的测试是真的

if [ $a = ];then echo 'good';fi
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 5

它是空字符串。

这与执行相同:

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 的测试。

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

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

所以应该是:

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)