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.
You could use
eval
, though using direct indirection as suggested by SiegeX is probably nicer if you can usebash
.This worked surprisingly well:
It has all the POSIX clunkiness, in Bash would be much sorter, but then again, you won't need it because you have
${!}
. This -in case it proves solid- would have the advantage of using only builtins and noeval
. If I were to construct this function using an external command, it would have to besed
. Would obviate the need for the read loop and the substitutions. Mind that asking for indirections in POSIX without eval, has to be paid with clunkiness! So don't beat me!In bash (but not in other sh implementations), indirection is done by:
${!arg}
Input
Output
Even though the answer's already accepted, here's another method for those who need to preserve newlines and special characters like Escape (
\033
): Storing the variable in base64.You need: bc, wc, echo, tail, tr, uuencode, uudecode
Example
Result
Alternative
You also could use the
set
command and parse it's output; with that, you don't need to treat the variable in a special way before it's accessed.