Andre
Andre

Reputation: 21

bash if clause with and or combined

I'm trying to be smart but it doesn't work. Can anybody help me to do this a bit simpler?

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

Is there a way to combine it?

Upvotes: 2

Views: 650

Answers (2)

randomir
randomir

Reputation: 18687

As others have noted, your boolean expression can be simplified applying the law of distributivity of conjunction (⋀, *, AND) over disjunction (⋁, +, OR):

(a ⋀ b) ⋁ (a ⋀ c) = a ⋀ (b ⋁ c)

But to simplify it further, note you can, in bash, use && and || inside the (bash-specific) [[ .. ]] command:

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

Also, when using [[ .. ]] compound command (over POSIX [ .. ]) you don't have to quote variables. And to test for null-strings, you can use the shorter -z $var form over $var == "".

All this together yields:

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

To further simplify it, we would need to have more details on your application logic, possible values, etc.

Upvotes: 1

Cristian Ramon-Cortes
Cristian Ramon-Cortes

Reputation: 1888

Your code can be translated to:

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

Applying boolean arithmetics you can simplify it as:

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

This said, you can add a nested if statement to, first, check the C1 condition and, second, check the other conditions. It does not simplify the code a lot but here it is:

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

Upvotes: 2

Related Questions