为什么 -n 出现在我的 bash 测试 [[ 条件调试输出中?

为什么 -n 出现在我的 bash 测试 [[ 条件调试输出中?

我想测试一个条件是真还是假。下面是一个 bash 脚本示例:

#!/bin/bash
set -x
var=foo
if [[ $var==bar ]]
then
        echo $var is bar
else
        echo $var is not bar
fi
set +x

我预计输出将为foo is not bar,但我得到以下输出: foo is bar

在查看调试输出时,我注意到正在使用以下命令评估条件-n

+ var=foo
+ [[ -n foo==bar ]]
+ echo foo is bar
foo is bar
+ set +x

Bash 条件表达式手册页它说

-n 字符串

如果字符串长度非零,则为 True。

但我对字符串长度是否非零不感兴趣,而是对两个字符串是否彼此相等感兴趣。

答案1

[[的行为符合设计,因为$var==bar实际上不是比较两个字符串的条件表达式,而是单个字符串(恰好包含两个等号字符)。由于[[ ... ]]仅包含字符串而不是条件表达式,因此它的默认设置是使用标志来-n检查字符串是否不是零长度,从而以退出代码 进行计算0。但这不是您想要的,所以如果您想评估 $var 是否等于 bar,请在==运算符周围使用空格将其转换为条件表达式:

[[ $var == bar ]]

来自条件表达式手册页

字符串1 == 字符串2

字符串1 = 字符串2

如果字符串相等则为 True。当与 [[ 命令一起使用时,将执行如上所述的模式匹配(请参阅条件构造)。

'=' 应与测试命令一起使用以确保 POSIX 一致性。

相关内容