Loop iteration with two variables


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Loop iteration with two variables
# 15  
Old 07-31-2016
Hey Don,
I had to fix my shebang to #!/usr/bin/ksh, but it did not help. I have to run on ksh88 as i have no other choice and the output from your request is as follows with ksh88: The ksh88 does not like the parenthesis. ksh93 has no problem with the parenthesis, but that is not the version which i need it to run. Thanks again.

The following code in ksh88:

Code:
#!/usr/bin/ksh
set -xv
group1=("/usr/bin" "/usr/games")
group2=("/usr/local/bin" "/usr/local/games")
i=0
while [ $i -lt ${#group1[@]} ] && [ $i -lt ${#group2[@]} ]
do	echo diff -r "${group1[i]}" "${group2[i]}"
	i=$((i + 1))
done

produces the output:

Code:
Syntax error at line 3 : '(' is not expected

---------- Post updated at 08:33 AM ---------- Previous update was at 07:35 AM ----------

Don - I have a working solution, thanks to your efforts. This will allow me to take vendor code upgrades and spit out which of the property files have changes in numerous directories. This will save a ton of time, as currently we are going through each of them manually. I can't tell you now much i appreciate this. Here is the final solution. Thanks again.
Code:
#!/usr/bin/ksh
set -A old_dir /usr/version1/cmd /usr/version1/properties
set -A new_dir /usr/version2/cmd /user/version2/properties
i=0
while [ $i -lt ${#old_dir[@]} ] && [ $i -lt ${#new_dir[@]} ]
do	diff -r "${old_dir[i]}" "${new_dir[i]}" |awk 'NR==1{print $3}'
	i=$((i + 1))
done

# 16  
Old 07-31-2016
How about defining a function like
Code:
CV() { for i in $2; do echo diff -r $1${3% *}/$i $1${3#* }/$i; done; }

that you call with a path, a number (two or more) of subdirectories, and two versions to compare, both latter separated by spaces?
Code:
CV /usr/version 'cmd properties val' '1 2'
diff -r /usr/version1/cmd /usr/version2/cmd
diff -r /usr/version1/properties /usr/version2/properties
diff -r /usr/version1/val /usr/version2/val

# 17  
Old 07-31-2016
I'm glad you got arrays to work with your version of ksh88.

Did you also try the solutions Scrutinizer suggested in post #12?
# 18  
Old 08-01-2016
An extra possibility I thought of:

If the names may contain spaces:
Code:
group1="\
Joe
Brian
John Doe
Mark"

group2="\
Kim
Annie
Kate
Anna"

printf "%s\n" "$group1" "$group2" | pr -t2s:


--
If the lists always consist of only single words, you might get away with something like this:
Code:
group1="Joe Brian John Mark"
group2="Kim Annie Kate Anna"
printf "%s\n" $group1 $group2 | pr -t2s:

This User Gave Thanks to Scrutinizer For This Post:
# 19  
Old 08-01-2016
The post#12 does not work with an old Bourne shell
Code:
/tmp/sh37022: cannot open

Maybe a bug? The shell seems to remember the file name, not the handle.
This modification makes it work:
Code:
#!/bin/sh
group1="/usr/version1/cmd /usr/version1/properties"
group2="/usr/version2/cmd /user/version2/properties"

printf "%s\n" $group1 |
while read name1 && read name2 <&3
do
  echo "$name1" "$name2"
done 3<<EOF
`printf "%s\n" $group2`
EOF

The previous post can easily feed a while loop
Code:
#!/bin/sh
group1="/usr/version1/cmd /usr/version1/properties"
group2="/usr/version2/cmd /user/version2/properties"

printf "%s\n" $group1 $group2 | pr -t2 |
while read name1 name2
do
  echo "$name1" "$name2"
done

# 20  
Old 08-01-2016
Quote:
Originally Posted by MadeInGermany
The post#12 does not work with an old Bourne shell
[..]
The Bourne shell is not a POSIX compliant shell, so the code was not intended to work with it. The $(....) construct does not exist in the Bourne shell, however this could easily be replace with backticks.

Using backticks, I got the same error with a Bourne shell.
This part does not seem to work:
Code:
exec 3<<EOF
`printf "%s\n" $group2`
EOF

But I do not see a reason why it should not work.

Anyway, there is rarely a reason to script with the Bourne shell nowadays, since even now ancient Unix systems have at least one Posix compliant shell available.

Last edited by Scrutinizer; 08-02-2016 at 02:35 AM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

While loop is running only for the first iteration

Hello, I've written a script to automate encoding of all the MP4 files in a directory (incl. subdirectories). But unfortunately it's running for the first MP4 file only. My machine details: root@Ubuntu16:~# uname -a Linux Ubuntu16 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48... (2 Replies)
Discussion started by: prvnrk
2 Replies

2. Shell Programming and Scripting

While loop is causing ssh command to exit from script after first iteration.

I am trying to check multiple server's "uptime" in a loop over "ssh". When I execute multiple ssh commands with hard coded servernames script is executing fine. But when I pass server names using while loop, script is exiting after checking first server's status, why? # serverList... (8 Replies)
Discussion started by: kchinnam
8 Replies

3. Shell Programming and Scripting

Getting the iteration count in WHILE LOOP

bash in RHEL 6.4 I have a requirement in which I want to get the iteration count from a WHILE LOOP. The below mentioned simple script test.sh works fine. In the below script, the WHILE loop will iterate every 5 seconds infinitely until it greps the string BASKETBALL from /tmp/somestring.txt... (6 Replies)
Discussion started by: John K
6 Replies

4. Shell Programming and Scripting

Do something only that last iteration of loop

I have a script with logic like: my_function() { if mkdir $1 mkdir mydir_${2} else do something else fi } read in list of items while read list do my_function $list `date` done so basically it will make a directory for every name in the list and create a directory with the... (6 Replies)
Discussion started by: glev2005
6 Replies

5. Shell Programming and Scripting

For Loop in shellscript - Printing Output for every iteration

for VGLIST in `lsvg -o` do CLOSED_OUT=`echo $VGLIST | lsvg -l $VGLIST | awk '{print $6 " " $7}' | grep closed` if ]; then echo "Filesystems $CLOSED_OUT in VG that are in Closed status" else echo "\n Some message" fi Above Code is working fine, but echo "Filesystems $CLOSED_OUT... (8 Replies)
Discussion started by: chandu123
8 Replies

6. Shell Programming and Scripting

while loop stops after first iteration - remote ssh exit command problem?

I have written the following script to update some Debian boxes. #!/bin/bash mxg_hosts_file="/etc/mxg/ssh-hosts" while read line ; do mxg_host="$(echo ${line} | awk -F":" '{print $1}')" mxg_port="$(echo ${line} | awk -F":" '{print $2}')" echo "Connecting and Upgrading... (3 Replies)
Discussion started by: jelloir
3 Replies

7. Shell Programming and Scripting

for loop iteration and shell programming startup

question :how can i iterate to next item in for loop with the loop e.g for i in `cat abc.txt` do echo $i // this will display first line i=$i+1; // this doesnt work for me. echo $i; //this will display secound line done question: is my approach to manipulate text good? I have... (3 Replies)
Discussion started by: kashif_islam
3 Replies

8. Shell Programming and Scripting

howto stop loop iteration

I wonder how to stop further loop iterations when conditions gets false e.g. This file.txt contains the following structure : 1 2 3 4 5 6 7 8 9 10 How to stop iteration when if statement gets false ? for n in `cat file.txt` do if (( n<=5 )) (1 Reply)
Discussion started by: presul
1 Replies

9. Shell Programming and Scripting

Pick up the return code for every iteration and display the result only once in loop.

Hi All, I amlearning UNIX scripting. I have a small query. I would be thankful if any one helps me out. I have a below piece of code which delets the files. If file dosent have the permissions to delete a particular file I have used 2>>operator to track the error code. But my objective is... (1 Reply)
Discussion started by: manas6
1 Replies

10. Shell Programming and Scripting

New iteration of for-loop without incrementing?

Another question, is it possible to, in a for-loop incrementing until it reaches a certain number, to have it loop again without incrementing? Just have it drop what it is doing when it reaches this command and start again at the same number it was at? I know I could make a while loop and just... (0 Replies)
Discussion started by: jeriryan87
0 Replies
Login or Register to Ask a Question