【问题标题】:Unexpected behavior while executing logical and operation in shell [duplicate]在shell中执行逻辑和操作时出现意外行为[重复]
【发布时间】:2018-11-16 05:48:28
【问题描述】:
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)。 但出乎意料的是,我得到的输出为 false(1)。

【问题讨论】:

  • 在结束]之前需要一个空格。
  • $?不会告诉你条件是真还是假。它只会告诉您先前执行的命令是否成功执行。即使条件失败,命令执行成功也会返回true。

标签: bash shell syntax


【解决方案1】:

正如@BenjaminW 在评论中所说,您在结束] 之前需要一个空格。没有它,字符串"${_OPTION_START_DATETIME}"] 将被视为单个shell“单词”,其中一部分恰好被引用。由于该变量为空,所以它相当于""],它仅相当于]。因此,整个命令变为:

[ -n ]

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

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

【讨论】:

    猜你喜欢
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多