Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!sdd.hp.com!uakari.primate.wisc.edu!ames!amdahl!krs From: krs@uts.amdahl.com (Kris Stephens [Hail Eris!]) Newsgroups: comp.unix.shell Subject: Re: sh loop variable and "double indirection" Message-ID: Date: 28 Jan 91 04:09:16 GMT References: <1991Jan27.044258.18779@shibaya.lonestar.org> Reply-To: krs@amdahl.uts.amdahl.com (Kris Stephens [Hail Eris!]) Organization: Amdahl Corporation, Sunnyvale CA Lines: 62 In article <1991Jan27.044258.18779@shibaya.lonestar.org> afc@shibaya.lonestar.org (Augustine Cano) writes: >I am trying to specify (at run time) an upper limit for a loop in a shell >script. In pseudo-code the ideal would be something like this: > >read i >for 0 to i >do >... >done Let me give you the ksh version first, then the (slower) sh mods -- it's slower because each iteration requires a fork/exec not required in ksh. : # ksh version # (note -- in commentary, Augustine requests that we stop at i-1) typeset -i i j # make things run faster by naming these as ints j=0 # could be done on the typeset, but needed for the sh version echo "enter limit: \c" read i dummy # in case we get two words; also, you should test for a bad $i while [ $j -lt $i ] do eval 'var'$j'="$REAL_VALUE'$j'"' eval 'echo "var$j is $var'$j'"' ((j = $j + 1)) done exit The sh version is the same except for two parts: delete the typeset, because it's not in sh, and replace ((j = $j + 1)) with a call j=`expr $j + 1` (which is the extra fork/exec). >Not very elegant since a limit of 10 iterations is hard-wired. Can anybody >think of a more concise way to do this? Using PERL is not an option, this >must be portable sh code. > >The next problem is the thorny one. Some shell variables having been >previously set up, say: > >var0=REAL_VALUE0 >var1=REAL_VALUE1 >var2=REAL_VALUE2 >var3=REAL_VALUE3 >var4=REAL_VALUE4 > >I want to manipulate variable names inside the above loop such that >I could display the "REAL VALUEx" based on the current value of $i. Assuming that all possible REAL_VALUE* variables were defined somehow, the two eval instructions inthe sample loop will store their contents in the variables var0 through var${i-1} and print them out. If you're a Rexx programmer, eval in the shell is like Rexx's interpret. The args to eval are evaluated once (losing one level of quotation), the 'eval ' is stripped, and the resulting string is evaluated and executed. ...Kris -- Kristopher Stephens, | (408-746-6047) | krs@uts.amdahl.com | KC6DFS Amdahl Corporation | | | [The opinions expressed above are mine, solely, and do not ] [necessarily reflect the opinions or policies of Amdahl Corp. ]