Visit Our UNIX and Linux User Community


Turn For Loop into While Loop


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Turn For Loop into While Loop
# 1  
Old 07-31-2009
Turn For Loop into While Loop

This script does exactly what I need, it just doesn't seem as efficient as it could be.

Code:
#!/bin/sh
baseDirVar="/opt/user/"
cd ${baseDirVar}
sizeVar=`ls -s $(find . -name nohup*.out) | cut -d'.' -f 1`
for i in $sizeVar
do
        if [ "$i" -ge "5000" ];
                then
                        dirVar=`ls -s $(find . -name nohup*.out) | grep $i | cut -b 6-100`
                        curFile=`basename ${dirVar}`
                        curDir=`dirname ${dirVar}`
                        cd ${curDir}
                        ./rotate*
                        pwd
                        cd ${baseDirVar}
                        pwd
                        curFile=''
                        curDir=''
                else
                        curFile=''
                        curDir=''
                        echo "size not big enough"
                        cd ${baseDirVar}
        fi
done
exit

As you can see, it runs through the loop, which runs through the if then else for every file found matching nohup*.out, which can be up to 30 or so, but usually only 1 or two files will match the requirement to actually go through the if statement. Is there a way I can change this to a while loop to where it will only run through on the ones that are greater than 5000?

The two pwd's were just for while I was testing it, I have since deleted those two pwd commands.

---------- Post updated at 01:00 PM ---------- Previous update was at 12:44 PM ----------

Something else I just noticed. I admin quite a few different servers, and one of them had a log file that was like 100mb, so b/c of that it threw off my cut line. Is there a better and more dynamic way to use that, rather than giving it a static line of 6-100. Now, it's not a huge issue b/c I have this set to run by crontab every half-hour, so I doubt in that half hour I'll have a log that grows so much that it'll get past that digit and cause an issue, but in the initial running of the script on new servers, I have to modify it accordingly to the biggest log file on those servers.
# 2  
Old 07-31-2009
how about -
Code:
find . -name nohup*.out -exec ls -s {} \; | awk '$1>=5000' {print substr($0,6,100) | 
while read dirVar
do
   curFile=`basename ${dirVar}`  # this variable is not used
   curDir=`dirname ${dirVar}`   
   ${curDir}/rotate*
done

# 3  
Old 07-31-2009
Quote:
Originally Posted by jim mcnamara
how about -
Code:
find . -name nohup*.out -exec ls -s {} \; | awk '$1>=5000' {print substr($0,6,100) | 
while read dirVar
do
   curFile=`basename ${dirVar}`  # this variable is not used
   curDir=`dirname ${dirVar}`   
   ${curDir}/rotate*
done

Looks a lot more efficient, can you see my updated comment in the original post about the cut piece.

Also, I'd need to modify yours just a bit to cd to ${curDir} first, b/c whoever wrote the rotate script wrote it in a relative manner, so I have to be in that dir to run it. As for the curFile, yeah, again, that was a var I used in some of my test runs to make sure I was finding the correct file.

Also, you didn't define dirVar.
# 4  
Old 07-31-2009
If you need to start at pos 6 then go on to the end of the line change the awk to
Code:
  .| awk '$1>=5000' {print substr($0,6)

is that what you mean?
# 5  
Old 07-31-2009
Quote:
Originally Posted by jim mcnamara
If you need to start at pos 6 then go on to the end of the line change the awk to
Code:
  .| awk '$1>=5000' {print substr($0,6)

is that what you mean?
What I'm wondering is there a way to make it more dynamic, that way, say a log file decides to start growing like crazy at 01, and my crontab just ran, but won't run again for 29 minutes. If it grows enough to where the size field will be longer than the 4 characters it is now, the variable set by the ls command will be off, either it will have an extra space or it will have a number in it, causing the basename/dirname command to fail.

here's the example of when the script was ran and the size was too many digits:

Code:
size not big enough
size not big enough
dirname: too many arguments
Try `dirname --help' for more information.
./sizeTest.sh: line 13: ./rotate*: No such file or directory
dirname: too many arguments
Try `dirname --help' for more information.
./sizeTest.sh: line 13: ./rotate*: No such file or directory
size not big enough

As you can see the size of the log file had too many characters and screwed up the dirname/basename command:

Code:
ls -s $(find . -name nohup*.out) | cut -d'.' -f 1
    92
    32
166066
 10314
   104

Code:
 ls -s $(find . -name nohup*.out) | cut -b 6-100
2 ./path/to/nohupFile.out
2 ./path/to/nohupFile.out
6 ./path/to/nohupFile.out
4 ./path/to/nohupFile.out
4 ./path/to/nohupFile.out

I tried using a '.' as the delimiter, but that screws it up b/c then it delimit's the .out as well, so it doesn't pick up the entire filename.

---------- Post updated at 01:25 PM ---------- Previous update was at 01:18 PM ----------

Played with it a bit more, I think I got the dynamic part down:


Code:
#!/bin/sh
baseDirVar="/opt/user/"
cd ${baseDirVar}
sizeVar=`ls -s $(find . -name nohup*.out) | cut -d'.' -f 1`
for i in $sizeVar
do
        if [ "$i" -ge "1000" ];
                then
                        dirVar=`ls -s $(find . -name nohup*.out) | grep $i | cut -d'.' -f 2`
                        curFile=`basename .${dirVar}.out`
                        curDir=`dirname .${dirVar}.out`
                        cd ${curDir}
#                       ./rotate*
                        pwd;echo "${curDir}/${curFile}"
                        cd ${baseDirVar}
                        curFile=''
                        curDir=''
                else
                        curFile=''
                        curDir=''
                        echo "size not big enough"
                        cd ${baseDirVar}
        fi
done

I cahnged the cut line to do it by period, but then for curFile and curDir I just added the period in front of and the .out behind the variable and the dirname and basename command's ran fine. I had to change it to 1000 for the size, rather than the 5000, that way I'd get some results.

Now, this one ran even a bit slower than before, but that is probably b/c I had like 6 results instead of just 1 or 2.
# 6  
Old 08-04-2009
Anyone got anything on this. I got my script working exactly the way it should, but I'd like to be able to use a while loop or something else so it doesn't run so long.
# 7  
Old 08-04-2009
Fix:
Code:
find . -name "nohup*.out"

Why ? It's commandline. Do you like to tell for shell to make filegeneration or tell for find to search all nohup*.out files ?

Test it in some directory where you have those files:
echo "nohup*.out"
echo nohup*.out

Previous Thread | Next Thread
Test Your Knowledge in Computers #1008
Difficulty: Medium
A power series will converge for some values of the variable x and may diverge for others.
True or False?

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

For loop or while loop from a text file

Hi all, i developed a script to measure the uptime of a process in a Solaris 10/11 environments. All is well, but i came across a situation where there are multiple processes of the same name. Basically i have the following result file: beVWARS 13357 19592122 beVWARS 14329 19591910... (4 Replies)
Discussion started by: nms
4 Replies

2. Shell Programming and Scripting

awk loop using array:wish to store array values from loop for use outside loop

Here's my code: awk -F '' 'NR==FNR { if (/time/ && $5>10) A=$2" "$3":"$4":"($5-01) else if (/time/ && $5<01) A=$2" "$3":"$4-01":"(59-$5) else if (/time/ && $5<=10) A=$2" "$3":"$4":0"($5-01) else if (/close/) { B=0 n1=n2; ... (2 Replies)
Discussion started by: klane
2 Replies

3. Shell Programming and Scripting

Reset while loop to loop same file multiple times

Hi, I want to read file multiple times. Right now i am using while loop but that is not working. ex. While read line do while read line2 do echo stmt1 #processing some data based on data., done < file2.txt done < file1.txt # This will have 10... (4 Replies)
Discussion started by: tmalik79
4 Replies

4. Shell Programming and Scripting

Array Variable being Assigned Values in Loop, But Gone when Loop Completes???

Hello All, Maybe I'm Missing something here but I have NOOO idea what the heck is going on with this....? I have a Variable that contains a PATTERN of what I'm considering "Illegal Characters". So what I'm doing is looping through a string containing some of these "Illegal Characters". Now... (5 Replies)
Discussion started by: mrm5102
5 Replies

5. Shell Programming and Scripting

How to loop use while loop in csh script?

Hi all, i got 2 text file. file.txt value.txt i want use C shell script to write out while both of the file got different limit....how i going to write it in 1 while loop? (4 Replies)
Discussion started by: proghack
4 Replies

6. Shell Programming and Scripting

BASH loop inside a loop question

Hi all Sorry for the basic question, but i am writing a shell script to get around a slightly flaky binary that ships with one of our servers. This particular utility randomly generates the correct information and could work first time or may work on the 12th or 100th attempt etc !.... (4 Replies)
Discussion started by: rethink
4 Replies

7. Shell Programming and Scripting

Null Handling in Until loop. . .loop won't stop

Hi Im running this script, which is supposed to find the max value build some tables and then stop running once all the tables are built. Thing is , it keeps assigning a null value to $h and then $g is null so it keep building tables i.e. testupdateNUL. How can I stop this? Here is what I have: ... (4 Replies)
Discussion started by: brandono66
4 Replies

8. Shell Programming and Scripting

Using variables created sequentially in a loop while still inside of the loop [bash]

I'm trying to understand if it's possible to create a set of variables that are numbered based on another variable (using eval) in a loop, and then call on it before the loop ends. As an example I've written a script called question (The fist command is to show what is the contents of the... (2 Replies)
Discussion started by: DeCoTwc
2 Replies

9. Shell Programming and Scripting

Is there a better way I could have run this loop. (For loop with two variables)

Sorry for such a dreadful title, but I'm not sure how to be more descriptive. I'm hoping some of the more gurutastic out there can take a look at a solution I came up with to a problem, and advice if there are better ways to have gone about it. To make a long story short around 20K pieces of... (2 Replies)
Discussion started by: DeCoTwc
2 Replies

10. Shell Programming and Scripting

how to get the similar function in while loop or for loop

Dear all How to write the shell script for the following statement: (C programming) for (i=0;i<30;i++) { if i=1 continue *skip this number (To do function here....) ... } similar statement in while loop.... I wrote the script in sh... (3 Replies)
Discussion started by: trynew
3 Replies

Featured Tech Videos