Path: utzoo!mnetor!uunet!mcvax!unido!ecrcvax!alan From: alan@ecrcvax.UUCP (Alan P. Sexton) Newsgroups: comp.unix.wizards Subject: Re: Building Variable Names in Bourne Shell Message-ID: <521@ecrcvax.UUCP> Date: 24 Mar 88 11:32:45 GMT References: <12565@brl-adm.ARPA> Reply-To: alan@ecrcvax.UUCP (Alan P. Sexton) Organization: ECRC, Munich 81, West Germany Lines: 223 In article <12565@brl-adm.ARPA> kevinc@bearcat.lim.tek.com (Kevin Cosgrove 627-5212) writes: >Anyone know how to build *accessible* variable names on the fly in Bourne >shell? Below is a do nothing script which, I hope, demonstrates what I >want to do. > >#!/bin/sh >onestring="A" # set the values of arbitrary strings >twostring="B" >threestring="C" >for string in one two three # loop thru string sets >do > var="${string}string" # var contains the name of the string > # I wish to get access to > > echo "\$$var = ${var}" # how do I get the contents of the string > # "pointed to" by var? > echo >done Here is an example that I think will show how to do what you want. I wrote it a looooong time ago to learn how to do shell programming and kept it as a reference. I make no claim that it is a `good' example of a sh script - merely that it shows how to pretend that sh has dynamic array variables and the like. The script records a persons name, the number of hours of lectures and the number of hours of tutorials he has given. It is very stupid and it would be far easier to just edit a file to record the data. a script of a sample is included. I originally wrote this on a version 7 system (yes THAT long ago) and I just fixed it so that it works on a bsd4.3 system so that I could get the typescript. Alan Sexton ECRC, Arabellastr 17, alan@ecrcvax.UUCP 8000 Muenchen 81, West Germany mcvax!unido!ecrcvax!alan tel. (089) 92699164 #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # paycheck # typescript # This archive created: Thu Mar 24 12:28:57 1988 export PATH; PATH=/bin:$PATH echo shar: extracting "'paycheck'" '(1874 characters)' if test -f 'paycheck' then echo shar: will not over-write existing file "'paycheck'" else sed 's/^X//' << \SHAR_EOF > 'paycheck' X#! /bin/sh XN=1 Xif test -f "$1" Xthen X exec <$1 X while read NAME$N LECTS$N TUT$N X do X eval echo $"NAME$N" \\\ $"LECTS$N" \\\ $"TUT$N" X N=`expr $N + 1` X done X exec 0<&2 Xfi XNUMBER=`expr $N - 1` Xwhile true Xdo X while true X do X echo -n "Name: " X if read name X then X N=1 X while eval test $N -le $NUMBER -a \"$"NAME$N"\" != \""$name"\" X do X N=`expr $N + 1` X done X if test $N -gt $NUMBER X then X echo -n "New Lecturer? : " X read ANS X until test "$ANS" = "y" -o "$ANS" = "n" X do X echo -n "New Lecturer [y/n]? : " X read ANS X done X if test "$ANS" = "y" X then X eval NAME$N=$name X eval LECTS$N=0 X eval TUT$N=0 X NUMBER=$N X else X break X fi X fi X echo Name \ Lects. \ Tuts. X eval echo $"NAME$N" \\\ $"LECTS$N" \\\ $"TUT$N" X echo -n "Number of Lectures ? : " X read LECTS$N X echo -n "Number of Tutorials ? : " X read TUT$N X echo Name \ Lects. \ Tuts. X eval echo $"NAME$N" \\\ $"LECTS$N" \\\ $"TUT$N" X fi X ANS= X echo -n "Finished ? : " X read ANS X until test "$ANS" = "y" -o "$ANS" = "n" X do X echo -n "Finished [y/n] ? : " X read ANS X done X if test "$ANS" = "n" X then X break X else X break 2 X fi X done Xdone XN=1 Xwhile test $N -le $NUMBER Xdo X eval echo $"NAME$N" \\\ $"LECTS$N" \\\ $"TUT$N" X N=`expr $N + 1` Xdone Xecho 'output file name ( to quit with no output) : ' Xread file || ( echo "no output" ; exit 1 ) Xexec >$file XN=1 Xwhile test $N -le $NUMBER Xdo X eval echo $"NAME$N"\\\ $"LECTS$N"\\\ $"TUT$N" X N=`expr $N + 1` Xdone SHAR_EOF if test 1874 -ne "`wc -c < 'paycheck'`" then echo shar: error transmitting "'paycheck'" '(should have been 1874 characters)' fi chmod +x 'paycheck' fi # end of overwriting check echo shar: extracting "'typescript'" '(1025 characters)' if test -f 'typescript' then echo shar: will not over-write existing file "'typescript'" else sed 's/^X//' << \SHAR_EOF > 'typescript' XScript started on Thu Mar 24 12:23:20 1988 X% paycheck XName: alan XNew Lecturer? : y XName Lects. Tuts. Xalan 0 0 XNumber of Lectures ? : 2 XNumber of Tutorials ? : 3 XName Lects. Tuts. Xalan 2 3 XFinished ? : n XName: john XNew Lecturer? : y XName Lects. Tuts. Xjohn 0 0 XNumber of Lectures ? : 3 XNumber of Tutorials ? : 4 XName Lects. Tuts. Xjohn 3 4 XFinished ? : y Xalan 2 3 Xjohn 3 4 Xoutput file name ( to quit with no output) : Xtst X% X% cat tst Xalan 2 3 Xjohn 3 4 X% paycheck tst Xalan 2 3 Xjohn 3 4 XName: john XName Lects. Tuts. Xjohn 3 4 XNumber of Lectures ? : 4 XNumber of Tutorials ? : 6 XName Lects. Tuts. Xjohn 4 6 XFinished ? : n XName: fred XNew Lecturer? : y XName Lects. Tuts. Xfred 0 0 XNumber of Lectures ? : 1   XNumber of Tutorials ? : 2 XName Lects. Tuts. Xfred 1 2 XFinished ? : y Xalan 2 3 Xjohn 4 6 Xfred 1 2 Xoutput file name ( to quit with no output) : Xtst X% cat tst Xalan 2 3 Xjohn 4 6 Xfred 1 2 X% ^D Xscript done on Thu Mar 24 12:26:07 1988 SHAR_EOF echo shar: 2 control characters may be missing from "'typescript'" if test 1025 -ne "`wc -c < 'typescript'`" then echo shar: error transmitting "'typescript'" '(should have been 1025 characters)' fi fi # end of overwriting check # End of shell archive exit 0 -- Alan Sexton ECRC, Arabellastr 17, alan@ecrcvax.UUCP 8000 Muenchen 81, West Germany mcvax!unido!ecrcvax!alan tel. (089) 92699164