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


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


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


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:
 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 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