How can I check if a variable is empty in Bash?
In Bash at least the following command tests if $var is empty:
if [[ -z "$var" ]]; then
# $var is empty, do what you want
fi
The command man test
is your friend.
./test.ksh[8]: test: argument expected
dunnot the reason but single bracket didn't work but the double one had it. –
Fallacy if test -z "$var"
, right? –
Eugenides set -u
option has been activated, this test will fail with unbound variable
. In this case, you might prefer @alexli's solution. –
Linus [ -z "$var" ] && echo "empty"
–
Adamec [[: not found
on terminal UBUNTU –
Baht # $var is empty, do what you want
with echo "$var is empty, do what you want"
, so the snippet is copy-pastable. Otherwise it will throw an error at fi
–
Softfinned Presuming Bash:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
-z
: [[ -z "$an_unset_or_empty_var" ]] && echo empty
–
Ecclesia -z
is closer to what was asked. Jay has put this in his answer so I'll refrain from updating mine and leave this up as is. –
Floria -z
means Zero-length string, and -n
means Non-zero-length string. Reference: gnu.org/software/bash/manual/html_node/… –
Novation I have also seen
if [ "x$variable" = "x" ]; then ...
which is obviously very robust and shell independent.
Also, there is a difference between "empty" and "unset". See How to tell if a string is not defined in a Bash shell script.
$variable
is empty, then the string to the left of the comparison operator becomes only x
, which is then equal to the string to the right of the operator. [ x = x ]
is "true", so in practice this tests whether $variable
is empty or not. As an addition (3½ years after the fact :-) ) I would never use this myself since -z
does what I probably want in a clearer way, but I wanted to add this answer since this method is frequently seen "in the wild"; perhaps written this way on purpose by people who have had different experiences than I have. –
Gonsalez configure
scripts, and it works with sh
and any non-standard bash
which might not have the -z
flag. This situation was commonly the case when there were many flavors of Unix which were all mildly incompatible with each other in minor details, such as support for a -z
flag. Now that Linux has taken over, it is not much of an issue (unless you are on an old, funny Unix) –
Reset if [ ${foo:+1} ]
then
echo "yes"
fi
prints yes
if the variable is set. ${foo:+1}
will return 1 when the variable is set, otherwise it will return empty string.
set -u
option (nounset
) is activated. Almost all other answers to this question will fail with unbound variable
in this case. –
Linus :+
notation is also useful for situations where you have optional command line parameters that you have specified with optional variables. myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
–
Eurhythmy [ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
${variable:-default_value}
–
Espinoza [ "$variable" ] || exit
–
Zany track=${1:?"A Track number, like 't41', must be the first parameter"}
. Your second line does not work in bash; maybe you meant : ${variable:="value_to_set_if_unset"}
. See gnu.org/software/bash/manual/html_node/… –
Greenish The question asks how to check if a variable is an empty string and the best answers are already given for that.
But I landed here after a period passed programming in PHP, and I was actually searching for a check like the empty function in PHP working in a Bash shell.
After reading the answers I realized I was not thinking properly in Bash, but anyhow in that moment a function like empty in PHP would have been soooo handy in my Bash code.
As I think this can happen to others, I decided to convert the PHP empty function in Bash.
According to the PHP manual:
a variable is considered empty if it doesn't exist or if its value is one of the following:
- "" (an empty string)
- 0 (0 as an integer)
- 0.0 (0 as a float)
- "0" (0 as a string)
- an empty array
- a variable declared, but without a value
Of course the null and false cases cannot be converted in bash, so they are omitted.
function empty
{
local var="$1"
# Return true if:
# 1. var is a null string ("" as empty string)
# 2. a non set variable is passed
# 3. a declared variable or array but without a value is passed
# 4. an empty array is passed
if test -z "$var"
then
[[ $( echo "1" ) ]]
return
# Return true if var is zero (0 as an integer or "0" as a string)
elif [ "$var" == 0 2> /dev/null ]
then
[[ $( echo "1" ) ]]
return
# Return true if var is 0.0 (0 as a float)
elif [ "$var" == 0.0 2> /dev/null ]
then
[[ $( echo "1" ) ]]
return
fi
[[ $( echo "" ) ]]
}
Example of usage:
if empty "${var}"
then
echo "empty"
else
echo "not empty"
fi
Demo:
The following snippet:
#!/bin/bash
vars=(
""
0
0.0
"0"
1
"string"
" "
)
for (( i=0; i<${#vars[@]}; i++ ))
do
var="${vars[$i]}"
if empty "${var}"
then
what="empty"
else
what="not empty"
fi
echo "VAR \"$var\" is $what"
done
exit
outputs:
VAR "" is empty
VAR "0" is empty
VAR "0.0" is empty
VAR "0" is empty
VAR "1" is not empty
VAR "string" is not empty
VAR " " is not empty
Having said that in a Bash logic the checks on zero in this function can cause side problems imho, anyone using this function should evaluate this risk and maybe decide to cut those checks off leaving only the first one.
This will return true
if a variable is unset or set to the empty string ("").
if [ -z "$MyVar" ]
then
echo "The variable MyVar has nothing in it."
elif ! [ -z "$MyVar" ]
then
echo "The variable MyVar has something in it."
fi
elif !
instead of else
? –
Reata ! [ -z "$MyVar" ]
would mean that the variable would have something in it. But ideally one would use else
. –
Hydrothorax You may want to distinguish between unset variables and variables that are set and empty:
is_empty() {
local var_name="$1"
local var_value="${!var_name}"
if [[ -v "$var_name" ]]; then
if [[ -n "$var_value" ]]; then
echo "set and non-empty"
else
echo "set and empty"
fi
else
echo "unset"
fi
}
str="foo"
empty=""
is_empty str
is_empty empty
is_empty none
Result:
set and non-empty
set and empty
unset
BTW, I recommend using set -u
which will cause an error when reading unset variables, this can save you from disasters such as
rm -rf $dir
You can read about this and other best practices for a "strict mode" here.
To check if variable v is not set
if [ "$v" == "" ]; then
echo "v not set"
fi
If you prefer to use test
:
test -z $AA && echo empty || echo not-empty
AA=aa; test -z $AA && echo empty || echo not-empty
AA=aa; test ! -z $AA && echo empty || echo not-empty
© 2022 - 2024 — McMap. All rights reserved.
-n
and-z
(their context) really matters, and that with the shell scripting languages their are any number of (seemingly subtle) gotchas to be aware of. – Ladino