On 100430 08:19, Greg Wooledge wrote:
> On Fri, Apr 30, 2010 at 12:02:58AM +0200, Freddy Vulto wrote:
> > Passing variables by reference however, has a caveat in that
> > local variables override the passing by reference, e.g.:
> >
> > t() {
> > local a
> > eval $1=b
> > }
> > unset a; t a; echo $a # Outputs nothing, expected "b"
>
> Why did you declare 'a' to be local if that's not what you wanted?
> Why did you expect 'b' to be output, if you used a local variable?
t() is an example library function which - as a black box - can contain
many local variables. Local 'a' is just an example.
I would like to call t(), and let it return me a filled variable by
reference, that is without polluting the global environment.
Problem is, all variables work except 'a' because t() happens to declare
this local - which I'm not supposed to know because t() is a black box.
Maybe the example is not clear because 'a' becomes global after all,
and is this a better example:
# Param: $1 variable name to return value to
blackbox() {
local a
eval $1=bar
}
This goes all right:
f() {
local b
blackbox b
echo $b
}
f # Echos "bar" all right
But if I change 'b' to 'a', this conflicts with blackbox() local 'a':
f() {
local a
blackbox a
echo $a
}
f # Outputs nothing unexpected
Freddy Vulto
http://fvue.nl/wiki/Bash:_passing_variables_by_reference