The most straightforward method uses the -z
operator to test for empty strings:
if [ -z "$variable" ]; then
echo "Variable is empty"
else
echo "Variable contains: $variable"
fi
Always quote your variables to handle cases where they might contain spaces or special characters:
# Correct way
if [ "$variable" = "" ]; then
# Risky without quotes
if [ $variable = "" ]; then # May fail for unset variables
There's an important distinction between unset variables and empty strings:
# Check if variable is unset
if [ -z "${variable+x}" ]; then
echo "Variable is unset"
# Check if variable is empty (could be set to "")
elif [ -z "$variable" ]; then
echo "Variable is set but empty"
fi
For bash-specific scripts, double brackets provide more robust string handling:
if [[ -z $variable ]]; then # Quotes optional inside [[ ]]
echo "Empty or unset"
fi
# More advanced pattern matching
if [[ ! $variable ]]; then # Also catches empty strings
echo "Variable has no meaningful value"
fi
Here's how you might check for empty arguments in a script:
#!/bin/bash
if [ -z "$1" ]; then
echo "Error: No input file specified" >&2
exit 1
fi
input_file="$1"
echo "Processing $input_file"
While all these methods are fast, here's a quick benchmark for 10,000 iterations:
time for i in {1..10000}; do [ -z "$var" ]; done
# real 0m0.045s
time for i in {1..10000}; do [[ -z $var ]]; done
# real 0m0.032s
When writing bash scripts, checking whether a variable is empty or undefined is a common task. There are several ways to accomplish this, each with its own advantages and potential pitfalls.
The simplest way to check for an empty variable is:
if [ -z "$variable" ]; then
echo "Variable is empty"
fi
This works for both empty strings ("") and undefined variables.
Be aware of these common mistakes:
# Wrong: missing quotes can cause syntax errors
if [ -z $variable ]; then
# Wrong: using -z on unquoted undefined variable
if [ -z $undefined_var ]; then
Here are some other valid approaches:
# Method 1: Using parameter expansion
if [ "${variable:-}" = "" ]; then
# Method 2: The 'x' pattern (old but reliable)
if [ "x$variable" = "x" ]; then
# Method 3: Using double brackets
if [[ -z $variable ]]; then
To distinguish between undefined and empty variables:
# Check if variable is undefined
if [ -z "${variable+set}" ]; then
echo "Variable is undefined"
fi
# Check if variable is empty (but defined)
if [ -z "$variable" ] && [ "${variable+set}" = "set" ]; then
echo "Variable is empty but defined"
fi
Here's how you might use this in a real script:
#!/bin/bash
read -p "Enter your name: " username
if [ -z "$username" ]; then
echo "Error: No name entered" >&2
exit 1
fi
echo "Hello, $username!"
For scripts where performance matters:
- The
-z
test is generally fastest - Parameter expansion methods are slightly slower but more flexible
- The 'x' pattern is reliable but considered somewhat archaic
While there are multiple ways to check for empty variables in bash, the -z
test with proper quoting is generally the most straightforward and reliable method for most use cases.