Re: Using variables in variables names

2006-03-14 Thread Dirk H. Schulz

Oh Mike,

thanks a lot for such detailled and well structured clarification! That 
did it, now I can use it (and it gave my script a speedup of nearly 70 % 
less running time).


Many thanks!

Dirk

Mike Stroyan schrieb:


On 3/13/06, Paul Jarc <[EMAIL PROTECTED]> wrote:
 


"Dirk H. Schulz" <[EMAIL PROTECTED]> wrote:
   


Paul Jarc schrieb:
 


ac=12 eval "dings$ac=wasannersder"
   


And how do I reference it then?
 


ac=12 eval "value=\$dings$ac"
echo $value

Or:

ac=12 name=dings$ac echo ${!name}
   



It seems that you need to use the eval form instead of the ${!var} form
to handle array variables.  Here are some examples I played with.  The
pattern is to use a backslash to quote the $ for the array name.  The $i
in the array examples could be done as \$i because it works out the same
if it is expanded in either the first pass or the second pass.

$ suffix=one
$ eval "pre_${suffix}=simple1"
$ suffix=two
$ eval "pre_${suffix}=simple2"
$ suffix=one
$ eval "echo \$pre_${suffix}"
simple1
$ suffix=two
$ eval "echo \$pre_${suffix}"
simple2
$ suffix=one
$ i=1
$ eval "pre_A_${suffix}[$i]=array1_1"
$ i=2
$ eval "pre_A_${suffix}[$i]=array1_2"
$ suffix=two
$ i=1
$ eval "pre_A_${suffix}[$i]=array2_1"
$ i=3
$ eval "pre_A_${suffix}[$i]=array2_3"
$ set | grep pre_
_='pre_A_two[3]=array2_3'
pre_A_one=([1]="array1_1" [2]="array1_1")
pre_A_two=([1]="array2_1" [3]="array2_3")
pre_one=simple1
pre_two=simple2
$ i=1
$ eval "echo \${pre_A_${suffix}[$i]}"
array2_1
$ eval "echo \${pre_A_${suffix}[$i]}"
array2_1
$ i=3
$ eval "echo \${pre_A_${suffix}[$i]}"
array2_3
$ i=2
$ suffix=one
$ eval "echo \${pre_A_${suffix}[$i]}"
array1_2

--
Mike Stroyan
[EMAIL PROTECTED]


___
Bug-bash mailing list
Bug-bash@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-bash
 





___
Bug-bash mailing list
Bug-bash@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-bash


Re: Using variables in variables names

2006-03-13 Thread Mike Stroyan
On 3/13/06, Paul Jarc <[EMAIL PROTECTED]> wrote:
> "Dirk H. Schulz" <[EMAIL PROTECTED]> wrote:
> > Paul Jarc schrieb:
> >> ac=12 eval "dings$ac=wasannersder"
> >
> > And how do I reference it then?
>
> ac=12 eval "value=\$dings$ac"
> echo $value
>
> Or:
>
> ac=12 name=dings$ac echo ${!name}

It seems that you need to use the eval form instead of the ${!var} form
to handle array variables.  Here are some examples I played with.  The
pattern is to use a backslash to quote the $ for the array name.  The $i
in the array examples could be done as \$i because it works out the same
if it is expanded in either the first pass or the second pass.

$ suffix=one
$ eval "pre_${suffix}=simple1"
$ suffix=two
$ eval "pre_${suffix}=simple2"
$ suffix=one
$ eval "echo \$pre_${suffix}"
simple1
$ suffix=two
$ eval "echo \$pre_${suffix}"
simple2
$ suffix=one
$ i=1
$ eval "pre_A_${suffix}[$i]=array1_1"
$ i=2
$ eval "pre_A_${suffix}[$i]=array1_2"
$ suffix=two
$ i=1
$ eval "pre_A_${suffix}[$i]=array2_1"
$ i=3
$ eval "pre_A_${suffix}[$i]=array2_3"
$ set | grep pre_
_='pre_A_two[3]=array2_3'
pre_A_one=([1]="array1_1" [2]="array1_1")
pre_A_two=([1]="array2_1" [3]="array2_3")
pre_one=simple1
pre_two=simple2
$ i=1
$ eval "echo \${pre_A_${suffix}[$i]}"
array2_1
$ eval "echo \${pre_A_${suffix}[$i]}"
array2_1
$ i=3
$ eval "echo \${pre_A_${suffix}[$i]}"
array2_3
$ i=2
$ suffix=one
$ eval "echo \${pre_A_${suffix}[$i]}"
array1_2

--
Mike Stroyan
[EMAIL PROTECTED]


___
Bug-bash mailing list
Bug-bash@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-bash


Re: Using variables in variables names

2006-03-13 Thread Paul Jarc
"Dirk H. Schulz" <[EMAIL PROTECTED]> wrote:
> Paul Jarc schrieb:
>> ac=12 eval "dings$ac=wasannersder"
>
> And how do I reference it then?

ac=12 eval "value=\$dings$ac"
echo $value

Or:

ac=12 name=dings$ac echo ${!name}


paul


___
Bug-bash mailing list
Bug-bash@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-bash


Re: Using variables in variables names

2006-03-13 Thread Dirk H. Schulz

Paul Jarc schrieb:


"Dirk H. Schulz" <[EMAIL PROTECTED]> wrote:
 


ac=12  dings$ac=wasannersder
-bash: dings12=wasannersder: command not found
 



Variable names in assignments are not subject to expansion.  So since
"dings$ac", as-is, does not fit the syntax for variable names, it
isn't treated as an assignment.  This will work:
ac=12 eval "dings$ac=wasannersder"
 


And how do I reference it then?


ac=12
eval "dings$ac=wasannersder"
echo $dings12
wasannersder  # that works
echo $('$dings'$ac) # trying to 
substitute $ac before $dings...

-bash: $dings12: command not found


Is there any way to reference it without anticipating the result of 
indirect referencing?


Dirk


___
Bug-bash mailing list
Bug-bash@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-bash


Re: Using variables in variables names

2006-03-13 Thread Paul Jarc
"Dirk H. Schulz" <[EMAIL PROTECTED]> wrote:
>> ac=12  dings$ac=wasannersder
>> -bash: dings12=wasannersder: command not found

Variable names in assignments are not subject to expansion.  So since
"dings$ac", as-is, does not fit the syntax for variable names, it
isn't treated as an assignment.  This will work:
ac=12 eval "dings$ac=wasannersder"


paul


___
Bug-bash mailing list
Bug-bash@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-bash


Using variables in variables names

2006-03-13 Thread Dirk H. Schulz

Hi folks,

I am sure this has been asked quite some times, but I did not find 
anything inspiring or helpful - in fact not too much at all.


For accelerating a script I need the possibility to set up an unknown 
number of arrays and to name them (at least partly) with values of a 
variable. It is like defining arrays with names that contain an 
increasing number: array$x.


While poking around I found out: This does not work at all, even with 
simple variables it does not.



dings=bums
echo $dings
bums
ac=12  dings$ac=wasannersder
-bash: dings12=wasannersder: command not found



I looked very deeply into man bash and any manual and howto I found, but 
did not find out any reason why this does not work. It must be one of 
the basic principles of expansion and assignment, but I would like to 
understand it.


And then the question of multi-dimensional arrays (see above). The 
"Advanced Bash Scripting Guide" mentions that it is possible to have 
them using indirect referencing - but I did not understand how this 
could be done.


Any idea, hint or help? It would be a great relief after two days of 
search and research.


Dirk




___
Bug-bash mailing list
Bug-bash@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-bash