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).
Linux
From Wikipedia, the free encyclopedia
Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).
Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.
Rules
- Posts must be relevant to operating systems running the Linux kernel. GNU/Linux or otherwise.
- No misinformation
- No NSFW content
- No hate speech, bigotry, etc
Related Communities
Community icon by Alpár-Etele Méder, licensed under CC BY 3.0
If you want true for empty strings, you want -z not -n
if [[ -z "VARIABLE1" && -z "VARIABLE2" ]]; then
echo "OK"
fi
in [[
there is generally no need for quoting, except the right hand side of an =
comparison
[ condition1 ] && [ condition2 ] && echo "Good" || echo "Bad"
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.
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.
To check for an empty string, use -z
. -n
checks to see if a string is not empty.
in [[
, empty strings are falsy, so this also works:
[[ ! $VARIABLE1 && ! $VARIABLE2 ]] && echo "OK"
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...
Linux does use Python syntax... in Python.
In Bash though, it uses Bash syntax.
The variables need a dollar sign: $VARIABLE1
help test
shows what -n
and -z
do.
You need to reference the value of the variable, ie:
if [[ -n "$VARIABLE1" && -n "$VARIABLE2" ]]; then
echo "OK"
fi
not working, both variables do not exist and the echo "OK"
do not trigger.
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.
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
Could try:
if [ condition1 ] && [ condition2 ]; then
echo "OK"
fi