Learning about shell indirect expansion
SoftwareI learned something about shell scripts this weekend that until now I only thought was possible with dereferencing and pointers in language like C and Perl. In short, they let you pull the value of a named variable from another.
It’s easier to explain with an example. Say you have a series of interface shell variables, and a count:
IFACE1="x.x.x.x/24"
IFACE2="x.x.x.x/23"
IFACE3="x.x.x.x/32"
IFACES="3"
Ideally you’d just write a shell loop to get each of these, but that just prints the variable name.
for I in $(seq 1 $IFACES); do
echo "IFACE${I}"
done
==> IFACE1
==> IFACE2
==> IFACE3
In bash you can dereference these using indirect expansion. Note the exclamation mark syntax:
CONFIG="IFACE1"
echo ${!CONFIG}
==> x.x.x.x/24
Now you can iterate over these list of shell variables in your if statement, and get what you need.
This works, but it’s bash specific, as I discovered this weekend while removing bashisms from OrionVM’s FreeBSD and NetBSD templates. The good news is you can achieve the same result using eval
:
CONFIG="IFACE1"
eval echo \$$KEY
==> x.x.x.x/24
I wonder if you could do something less hacky in ksh, which both these BSDs have?