首页 > 解决方案 > 在 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)。

标签: bashshellsyntax

解决方案


正如@BenjaminW 在评论中所说,您在关闭之前需要一个空格]。没有它,字符串"${_OPTION_START_DATETIME}"]将被视为单个外壳“单词”,其中一部分恰好被引用。由于变量为空,所以它等价于""],也就是等价于 just ]。因此,整个命令变为:

[ -n ]

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

在这里和许多其他地方,空格绝对是 shell 语法的关键部分。有一些地方空格是可选的,但在大多数地方,在不改变命令含义(或导致语法错误)的情况下,不能添加或省略空格。


推荐阅读