bash - 在 shell 中执行逻辑和操作时出现意外行为
问题描述
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 中,如果条件为真,则输出为零(0)。我对二元运算真实逻辑的期望是真实的(0)。但出乎意料的是,我得到的输出为假(1)。
解决方案
正如@BenjaminW 在评论中所说,您在关闭之前需要一个空格]
。没有它,字符串"${_OPTION_START_DATETIME}"]
将被视为单个外壳“单词”,其中一部分恰好被引用。由于变量为空,所以它等价于""]
,也就是等价于 just ]
。因此,整个命令变为:
[ -n ]
[
...并且由于and之间只有一个参数]
,因此应用的测试是“那个单个参数是空白的吗?”。也就是说,-n
被视为要检查是否存在的字符串而不是运算符。“-n”不是空白,所以测试评估为真。
在这里和许多其他地方,空格绝对是 shell 语法的关键部分。有一些地方空格是可选的,但在大多数地方,在不改变命令含义(或导致语法错误)的情况下,不能添加或省略空格。