bash 条件构造未按预期工作

bash 条件构造未按预期工作

我试图查看 3 个变量是否具有相同的值 [DEFAULT],如果不是,我想执行其他函数。以下脚本中的所有变量都导出到系统环境。

#!/bin/bash
if [[ "$IOEngine" == "psync"  && ( "$TestType" == "read" || "randread" ) ]] && [[ ( "$DatasetSize" && "$BlockSize" && "$Threads" == "DEFAULT" ) ]]; then
    echo "all variables are Using DEFAULT"

elif [[ $IOEngine == "libaio"  && ( $TestType == "read" || "randread" ) ]] && [[ ( $DatasetSize || $BlockSize || $Threads || $FileSize || $RunTime == $preset ) ]]; then
   echo "all variables are Using DEFAULT"

else
    echo "one of the params is NON_DEFAULT"
    exit 1
fi

当我

"export DatasetSize=non_DEFAULT", 

输出不是执行 else 构造而是执行块本身。

输出:

all variables are Using DEFAULT

预期的:

one of the params is NON_DEFAULT

答案1

您正在使用此不受支持的快捷方式:

"$TestType" == "read" || "randread"

改用这个:

"$TestType" == "read" || "$TestType" == "randread"

这有同样的问题:

"$DatasetSize" && "$BlockSize" && "$Threads" == "DEFAULT"

答案2

[[ $DatasetSize ]]

返回0(测试通过)iff$DatasetSize计算为长度非零的字符串。

您的代码从不检查变量的内容。它只检查长度是否为非零。因此,默认值(非零长度)和任何非默认值(非零长度)都将导致相同的结果。


大概你没意识到这[[ $foo && $bar == "DEFAULT" ]]相当于

[[ $foo && ( $bar == "DEFAULT" ) ]]

不是这个

[[ $foo == "DEFAULT" && $bar == "DEFAULT" ]]

同样[[ $foo == "a" || "b" ]]相当于

[[ ( $foo == "a" ) || "b" ]]

b因为是非空字符串,所以它始终为真。所以这段代码

[[ <whatever expression> && ( $TestType == "read" || "randread" ) ]]

可以简化为[[ <whatever expression> ]]


还请注意,这些并不等同:

[[ $foo == $bar ]]
[[ $foo == "$bar" ]]

运算符右侧的字符串==被视为模式。不带引号的*?(以及一些其他内容,有些取决于extglobshell 选项)是特殊的,即使它们来自变量。引号可防止这种情况发生。使用时$RunTime == $preset请确保不需要$RunTime == "$preset"代替。

此处$foo可以或不可以双引号。在您的原始代码中,所有未加引号的变量都不需要加引号,但$preset如上所述,可能除外。

更多信息:什么时候需要双引号?

相关内容