在Shell中执行逻辑和操作时发生意外行为

时间:2018-11-16 05:48:28

标签: bash shell syntax

soham@zcon-63:~$ _OPTION_START_DATETIME=""
soham@zcon-63:~$ _OPTION_END_DATETIME=""
soham@zcon-63:~$ [ -n "${_OPTION_START_DATETIME}"]
soham@zcon-63:~$ echo $?
0
soham@zcon-63:~$ [ -n "${_OPTION_END_DATETIME}"]
soham@zcon-63:~$ echo $?
0
soham@zcon-63:~$ [ -n "${_OPTION_START_DATETIME}"] && [ -n "${_OPTION_END_DATETIME}" ]
soham@zcon-63:~$ echo $?
1
soham@zcon-63:~$

在shell中,如果条件为true,则输出为零(0)。 我对二进制运算的期望为true,逻辑为true,则为true(0)。 但是出乎意料的是,我得到的输出为false(1)。

1 个答案:

答案 0 :(得分:1)

正如@BenjaminW在评论中所说,在结束]之前需要一个空格。否则,字符串"${_OPTION_START_DATETIME}"]被当作一个单独的外壳“单词”,其一部分恰好被引用了。由于变量为空,因此等效于""],而等效于]。因此,整个命令变为:

[ -n ]

...并且由于[]之间只有一个参数,因此应用的测试是“单个参数是否为空白?”。也就是说,-n被视为要检查其是否存在的字符串,而不是运算符。 “ -n”不是空白,因此测试结果为true。

在这里和其他许多地方,空格是绝对关键的shell语法。在一些地方,空格是可选的,但是在大多数地方,如果不更改命令的含义(或导致语法错误),则不能添加或保留空格。