Check two conditions in bash ? [solved]
from Rick_C137@programming.dev to linux@lemmy.ml on 22 Sep 11:23
https://programming.dev/post/37875003

Hi,

I trying to test two condition together (AND) under bash but it’s not working…

The goal is ti have True when two variables are either not set or empty (empty string)

I’ve tried

if [[ -n VARIABLE1 && -n VARIABLE2 ]]; then
    echo "OK"
fi

Here I get the “OK” no matter what .

Thanks.

#linux

threaded - newest

fubarx@lemmy.world on 22 Sep 11:41 next collapse

Could try:

if [ condition1 ] && [ condition2 ]; then
  echo "OK"
fi
harsh3466@lemmy.ml on 22 Sep 11:47 next collapse

To check for an empty string, use -z. -n checks to see if a string is not empty.

Farnsworth@lemmy.world on 24 Sep 03:04 collapse

in [[, empty strings are falsy, so this also works:

[[ ! $VARIABLE1 && ! $VARIABLE2 ]] && echo "OK"
BillibusMaximus@sh.itjust.works on 22 Sep 11:50 next collapse

If you want true for empty strings, you want -z not -n

if [[ -z "VARIABLE1"  && -z "VARIABLE2"  ]]; then
    echo "OK"
fi
Farnsworth@lemmy.world on 24 Sep 03:05 collapse

in [[ there is generally no need for quoting, except the right hand side of an = comparison

DeuxChevaux@lemmy.world on 22 Sep 11:50 next collapse

[ condition1 ] && [ condition2 ] && echo “Good” || echo “Bad”

suff@piefed.social on 22 Sep 13:24 next collapse

Explanation

[ is an alias for the program test, so you can call man test for more info.
&& is bash syntax for conjunction. In A && B, B will only be called if A returned a exit code >0 (error). You can call man bash for more info.
|| is bash syntax for disjunction. In A || B, B will only be called if A returned exit code =0 (success).
true and false are programs that just return exit codes 0 respectively 1.

Farnsworth@lemmy.world on 24 Sep 02:42 collapse

Never use a && b || c. It is not the same as if a; then b; else c; fi: when a succeeds but b fails, it will run both b and c.

I would not bother with [ unless you absolutely need compatibility with non-bash shells.

thingsiplay@beehaw.org on 22 Sep 16:34 next collapse

Try this:

#!/usr/bin/env bash

a=""
if [[ -z "${a}" && -z "${b}" ]]; then
    echo "OK"
else
    echo "Not OK"
fi

a="OK"
if [[ -n "${a}" && -z "${b}" ]]; then
    echo "More ${a}"
else
    echo "More Unokay"
fi
kittenroar@beehaw.org on 22 Sep 16:43 next collapse

You need to reference the value of the variable, ie:

if [[ -n "$VARIABLE1" && -n "$VARIABLE2" ]]; then
    echo "OK"
fi
Rick_C137@programming.dev on 23 Sep 07:30 collapse

not working, both variables do not exist and the echo “OK” do not trigger.

kittenroar@beehaw.org on 23 Sep 15:17 collapse

Then it is working. That is what that code was checking for.

Specifically, -n checks if the variable exists and also does not have a null value.

If you want to reverse it, ie, check that those conditions are not true, put an exclamation mark in front of the whole thing.

Rick_C137@programming.dev on 23 Sep 08:01 next collapse

Thank you all for yours input

What finally did work

if [[ -z VARIABLE1 && -z VARIABLE2 ]]; then
    echo "OK"
fi

If only Linux was using Python syntax that would be so much more intuitive…

sping@lemmy.sdf.org on 24 Sep 01:49 next collapse

Linux does use Python syntax… in Python.

In Bash though, it uses Bash syntax.

Farnsworth@lemmy.world on 24 Sep 02:59 collapse

The variables need a dollar sign: $VARIABLE1

help test shows what -n and -z do.

dion_starfire@sh.itjust.works on 24 Sep 03:10 collapse

You’re probably wanting [ -z “${VAR1}” -a -z “${VAR2}” ]. Note in bash that there are minor differences in how [ ] and [[ ]] tests are handled. You can pull up a handy cheat sheet of the operands on most distros by running man test, though you’ll need to read through the CONDITIONAL EXPRESSIONS section of man bash if you want to see the minor differences of the single vs double square bracket commands (mostly whether locale applies to string order, as well as whether operands are evaluated in numeric comparisons).