11

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_.

  • 5
    Voted to reopen. The Q wants to know how to get indirectly, all the variables that match the wildcard (map_*). – slm Jan 30 '14 at 16:45
  • I was surprised I was unclear with regards to my question :P – Dashed Jan 31 '14 at 21:51
  • 4
    Please re-open. It's a case of sh VS bash -- see stackoverflow.com/a/5725402/1172302. – Nikos Alexandris Dec 22 '15 at 3:19
  • So this is why some folks don't like stackoverflow and some stackexchange sites. – Dashed Apr 15 '16 at 18:44
6

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
| improve this answer | |
  • Thanks! set was what I was looking for. – Dashed Jan 30 '14 at 16:31
  • 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 1 '19 at 12:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.