Indirect parameter substitution in shell script

posix, scripting, shell

Solution

You could use `eval`, though using direct indirection as suggested by SiegeX is probably nicer if you can use `bash`.

#!/bin/sh

foo=bar
print_arg () {
    arg=$1
    eval argval=\"\$$arg\"
    echo "$argval"
}
print_arg foo

Problem

I'm having a problem with a shell script (POSIX shell under HP-UX, FWIW). I have a function called print_arg into which I'm passing the name of a parameter as $1. Given the name of the parameter, I then want to print the name and the value of that parameter. However, I keep getting an error. Here's an example of what I'm trying to do: ``` #!/usr/bin/sh function print_arg { # $1 holds the name of the argument to be shown arg=$1 # The following line errors off with # ./test_print.sh[9]: argval=${"$arg"}: The specified substitution is not valid for this command. argval=${"$arg"} if [[ $argval != '' ]] ; then printf "ftp_func: $arg='$argval'\n" fi } COMMAND="XYZ" print_arg "COMMAND" ``` I've tried re-writing the offending line every way I can think of. I've consulted the local oracles. I've checked the online "BASH Scripting Guide". And I sharpened up the ol' wavy-bladed knife and scrubbed the altar until it gleamed, but then I discovered that our local supply of virgins has been cut down to, like, nothin'. Drat! Any advice regarding how to get the value of a parameter whose name is passed into a function as a parameter will be received appreciatively.

Original source