14

Is it possible, or is there some elegant hack to do indirect variable expansion in POSIX as can be done in Bash?

For context, I'm trying to do the following:

for key in ${!map_*}
do
    # do something
done

EDIT: To clarify, I'd like to access shell variables that begin with map_.

Dashed
  • 283

1 Answers1

7

The hack is to use eval:

aaa=1
aab=2
aac=3

eval_like() {
    pattern=$1
    vars=`set |grep "^$pattern.*=" | cut -f 1 -d '='`
    for v in $vars; do
        eval vval="\$$v"
        echo $vval
    done
}   

for i in `eval_like aa`; do
    echo $i
done
Zaar Hai
  • 343
  • Thanks! set was what I was looking for. – Dashed Jan 30 '14 at 16:31
  • 1
    That's not foolproof though and is an arbitrary command injection vulnerability (like when it's run in an environment that has QUERYSTRING=$'\nmap_$(reboot)=x'). Also beware that the bash shell includes the list of functions in the output of set (when not running as sh). – Stéphane Chazelas Aug 01 '19 at 12:10