Iterating over an array of bash variables
I had a requirement for a bash script to check for required variables before running a function. Rather than creating a conditional block for each required variable (or in my case, needing to dynamically change them), let's do something that's more terse and maintainable. The example covers a few bash concepts:
- Generating an array of variable names
- Variable name as a string (indirect parameter expansion)
- Breaking a loop over an array (control flow)
#!/bin/bash
ERROR=0
declare -a REQUIRED=(
"APP_VAR_1" "APP_VAR_2" "APP_VAR_3"
)
for REQ in "${REQUIRED[@]}"
do
if [ -z "${!REQ}" ]; then
ERROR=1
printf "\n - ERROR: ${REQ} undefined.\n\n"
break
fi
done
run ()
{
printf "\n - Validated.\n\n"
}
if [ "${ERROR}" == 0 ]; then
run
fi
The ${REQUIRED[@]}
syntax sets up the iterable REQ
variable. We can access the literal name of the variable with ${REQ}
syntax. Whereas, we can access the value of the variable with ${!REQ}
indirect parameter expansion. If all the required variables are not -z
null, the run()
function will continue as expected.