How can I check if a variable is empty in Bash?
11 Answers
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.
-
77double square brackets are useless here. it may be simple [ -z "$var" ] or even easier imho if test -z "var" .. anyway +1 :) Commented Aug 31, 2012 at 20:15
-
2double square brackets are not useless, if I do not inlcude I ma getting
./test.ksh[8]: test: argument expected
dunnot the reason but single bracket didn't work but the double one had it. Commented Oct 4, 2013 at 7:24 -
12
-
1Just an added comment for a specific situation not directly mentioned in the question: if the variable is unset and the
set -u
option has been activated, this test will fail withunbound variable
. In this case, you might prefer @alexli's solution.– anolCommented May 26, 2015 at 16:34 -
3@LucaBorrione Just as a late side note: "[[" can be seen as "never useless"; as using "[[" has some advantages over "[" (see stackoverflow.com/questions/669452/… for example)– GhostCatCommented Jun 1, 2015 at 8:06
Presuming Bash:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
-
20The more direct answer is
-z
:[[ -z "$an_unset_or_empty_var" ]] && echo empty
Commented Jun 17, 2010 at 12:02 -
4@glenn jackman: good comment; it's true that
-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. Commented Jun 17, 2010 at 19:10 -
13Note that
-z
means Zero-length string, and-n
means Non-zero-length string. Reference: gnu.org/software/bash/manual/html_node/… Commented Feb 6, 2022 at 4:43 -
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.
-
2Looks strange to me. Could you please explain this solution. Thank you.– guettliCommented Nov 12, 2015 at 9:57
-
3@guettli: If
$variable
is empty, then the string to the left of the comparison operator becomes onlyx
, 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. Commented Nov 12, 2015 at 15:18 -
1"Since this method is frequently seen "in the wild";" This is commonly seen in
configure
scripts, and it works withsh
and any non-standardbash
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)– LinasCommented Mar 10, 2021 at 15:36
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.
-
5While not mentioned in the question, an important advantage of this answer is that it works even when the variable is undefined and the
set -u
option (nounset
) is activated. Almost all other answers to this question will fail withunbound variable
in this case.– anolCommented May 26, 2015 at 16:29 -
This
:+
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}
Commented Jul 24, 2018 at 19:59
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
-
-
1@ehime to make a default value you would use
${variable:-default_value}
Commented Nov 17, 2015 at 9:25 -
This is a quick way to check the validity of an entry of a variable and exit if not set:
[ "$variable" ] || exit
Commented Jan 9, 2019 at 12:40 -
Your first line is a re-implementation of the bash
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/…– CliffCommented Jul 13, 2023 at 15:22
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
-
5
-
1Just to make a distinction between the two statements, ie using
! [ -z "$MyVar" ]
would mean that the variable would have something in it. But ideally one would useelse
.– 3kstcCommented Jun 19, 2017 at 23:14
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.
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
-
be wary: if echo empty or the replacement returns a falsey expression echo not-empty will run also Commented Feb 13 at 23:09
-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.