我正在尝试查看 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
您正在使用不受支持的快捷方式:
"$TestType" == "read" || "randread"
改用这个:
"$TestType" == "read" || "$TestType" == "randread"
这有同样的问题:
"$DatasetSize" && "$BlockSize" && "$Threads" == "DEFAULT"
这个
返回
0
(测试通过)当且仅当$DatasetSize
计算结果为长度为非零的字符串。您的代码从不检查变量的内容。它只检查长度是否非零。因此,默认值(非零长度)和任何非默认值(非零长度)将导致相同的结果。
可能你没有意识到这
[[ $foo && $bar == "DEFAULT" ]]
等同于这个不是这个
同样
[[ $foo == "a" || "b" ]]
相当于这始终为真,因为
b
它是一个非空字符串。所以这段代码可以减少到
[[ <whatever expression> ]]
。另请注意,这些并不等同:
运算符右侧的字符串
==
被视为模式。不带引号的*
or?
(和其他一些东西,一些取决于extglob
shell 选项)是特殊的,即使它们来自变量。引用可以防止这种情况。在你使用的地方$RunTime == $preset
确保你不需要$RunTime == "$preset"
。这里
$foo
可能会或可能不会被双引号。在您的原始代码中,所有未引用的变量都不需要引用,除了 maybe$preset
,如上所述。更多信息:何时需要双引号?