Visit Our UNIX and Linux User Community


Do something only that last iteration of loop


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Do something only that last iteration of loop
# 1  
Old 02-14-2013
Do something only that last iteration of loop

I have a script with logic like:
Code:
my_function()
{
if [ $2 ]
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 date appended (which I only want to do once). What I want to know is how do I perform the line "mkdir mydir_${2}" only once? This is not the script itself, so this example it a bit silly, but the logic is there, I want to iterate through a list and call a function with each item in the list, but there is one element in the function that should only happen once.. Assume that the argument $2 is something that will not change through each iteration, so I do not want to repeat the process doing the same thing over and over. Is there a better solution than to create another function and call it? There is a reason that I dont move this line out of the function, but it's difficult to explain without posting my company's intellectual property.
# 2  
Old 02-14-2013
If it's something you only do once, it t really belong in a function you call 10,000 times. Do it before the loop.

This is especially true since the value of `date` may change if your script takes a long time to finish! Even if it doesn't, you're running date 10,000 times when all you needed was to run it once. Save it into a variable.

What is this if [ $2 ] ? I suspect that doesn't do what you think it does.

Code:
DATE=`date`

function() {
        echo asdf
}

mkdir mydir_${DATE}

while ...
do
        function ...
done

# 3  
Old 02-14-2013
if [ $2 ] I am using this to mean test if $2 has a value
# 4  
Old 02-14-2013
Use -z for that. -z tests if a string is blank.

Code:
if [ ! -z "$2" ]
then
        echo "value $2"
else
        echo "2 is blank"
fi

And don't leave out the quotes. [ ! -z ] is a syntax error, [ ! -z "" ] is not.
This User Gave Thanks to Corona688 For This Post:
# 5  
Old 02-14-2013
Such badness can be done.
Code:
DATE=`date`
# global variable stores a state of a function
gdone=0

func() {
        echo asdf
 if [ $gdone -eq 0 ]
 then
  gdone=1
  mkdir mydir_${DATE}
 fi
}

while ...
do
        func
done

This User Gave Thanks to MadeInGermany For This Post:
# 6  
Old 02-14-2013
There's lots of ways to do it.

You could mkdir -p, so mkdir won't complain when the directory already exists.

You could [ -d dirname ] || mkdir dirname.

You could mkdir dirname 2>/dev/null and just ignore all errors.

The problem is, you're either doing or checking something 10,000 times, that you didn't need to do even once, adding three lines of code to your function to save one line of code outside it. Why bother?
# 7  
Old 02-14-2013
I apologize, this was a poor question. I should just move the line out of the loop, there is no better solution. Thank you for all of your help.

Previous Thread | Next Thread
Test Your Knowledge in Computers #111
Difficulty: Easy
The Unix version with the largest installed base in 2019 is macOS.
True or False?

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

Loop iteration with two variables

Hello, I have been stuck on this for some time and invested many hours trying to find a solution. I am trying to either loop through two variables or or two arrays and not sure how to do it. I am limited to ksh only, and don't have the ability to do a foreach, or for i AND for j etc...I... (19 Replies)
Discussion started by: Decoy Octopus88
19 Replies

3. 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

4. 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

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

Featured Tech Videos