bash if with with with和or combined

时间:2017-11-09 13:32:44

标签: bash if-statement clause

我正在努力做到聪明但却行不通。有人能帮我做一点这么简单吗?

if [[  "${DATUM}" == "${today}" &&  "${STUNDE}" == "${HH24}" ]] || [[  "${DATUM}" == "${today}" &&  "${STUNDE}" == "20" ]] || 
[[  "${DATUM}" == "${today}" &&  "${STUNDE}" == "" && "20" == "${HH24}"  ]]; then

有没有办法将它结合起来?

2 个答案:

答案 0 :(得分:1)

您的代码可以翻译为:

(C1 and C2) or (C1 and C3) or (C1 and C4 and C5)

应用布尔算术,您可以将其简化为:

C1 and (C2 or C3 or (C4 and C5))

这就是说,你可以添加一个嵌套的if语句,首先检查C1条件,然后检查其他条件。它并没有简化代码,但在这里它是:

if [ "${DATUM}" = "${today}" ]; then
    if [ "${STUNDE}" = "${HH24}" ] || [ "${STUNDE}" = "20" ] || { [ "${STUNDE}" = "" ] && [ "${HH24}" = "20" ]; }; then       
        # Insert the code to execute when the conditions are satisfied
    fi
fi

答案 1 :(得分:0)

正如其他人所说,使用law of distributivity of conjunction (⋀, *, AND) over disjunction (⋁, +, OR)

可以简化您的布尔表达式
(a ⋀ b) ⋁ (a ⋀ c) = a ⋀ (b ⋁ c)

但为了进一步简化,请注意您可以在bash中使用&&||bash特定的)[[ .. ]]命令:

[[ $a == 1 && $b == 2 ]]

此外,当使用[[ .. ]]复合命令(超过POSIX [ .. ])时,您不必引用变量。要测试空字符串,您可以在-z $var上使用较短的$var == ""表单。

所有这些共同产生:

if [[ $DATUM == $today ]] && [[ $STUNDE == $HH24 || $STUNDE == 20 || -z $STUNDE && $HH24 == 20 ]]; then
    # ...
fi

为了进一步简化它,我们需要有关于应用程序逻辑,可能值等的更多详细信息。