Checking Multiple Variables in Bash
Let’s say you have a dozen variables in your script and you need to check if they have values set. The usual approach can get a bit tedious.
if [[ -z $var1 || -z $var2 || -z $var3 ]]; then ...
This gets even worse if you need to assign some default value to any variable that is not set:
if [ -z $var1 ]; then var1=unknown; fi if [ -z $var2 ]; then var2=unknown; fi if [ -z $var3 ]; then var3=unknown; fi
Here’s a different approach that can save you a lot of typing:
for i in var{1..3}; do
if [ -z "$(eval echo $(echo $`eval echo "${i}"`))" ] ; then
eval "$(echo ${i})"="$(echo "unknown")"
fi; doneIf you really have lots and lots of variables that require different default values, you may use a table. Parse this table to populate two arrays: one containing names of the variables and the other – their default values. Let’s say your
table.txt looks like this:variable_1,default_value variable_two,some other default value variable_whatever,nothing to see here
We will use it to build two arrays:
IFS=$'\n'
array_variables=($(awk -F, '{print $1}' table.txt))
array_defaults=($(awk -F, '{print $2}' table.txt))
unset IFSNow we can read the
array_variables array, check if the variables are set and, if not, assign a corresponding default value from the array_defaults array:for ((i = 0; i < ${#array_variables[@]}; i++))
do
if [ -z "$(eval echo $(echo $`eval echo "${array_variables[$i]}"`))" ]
then
eval "$(echo "${array_variables[$i]}")"="$(echo "\"${array_defaults[$i]}\"")"
fi
doneAnd to check that the variables have been set:
for i in $(printf '$%s\n' ${array_variables[@]}); do eval echo ${i}; done
default_value
some other default value
nothing to see here
