我试图查看 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" ]]
运算符右侧的字符串==
被视为模式。不带引号的*
或?
(以及一些其他内容,有些取决于extglob
shell 选项)是特殊的,即使它们来自变量。引号可防止这种情况发生。使用时$RunTime == $preset
请确保不需要$RunTime == "$preset"
代替。
此处$foo
可以或不可以双引号。在您的原始代码中,所有未加引号的变量都不需要加引号,但$preset
如上所述,可能除外。
更多信息:什么时候需要双引号?