for loop problems


 
Thread Tools Search this Thread
Operating Systems AIX for loop problems
# 1  
Old 07-31-2011
for loop problems

I have a script that loops through a list of users to list files owned by these users

Code:
for u is `cat users.list`
do
echo $u >> result.out
find /home -user $u >> result.out
find /var -user $u >> result.out
find /opt -user $u >> result.out
find /usr -user $u >> result.out
done

an so on...
when running this loop, I get this error "find: 0652-012 The user name does not exist." for each time the loop iterates. mind you that echo prints out the correct user name each time. its just the find command thats having problems.

And when I run find commands without looping, one user at a time i get results just fine. Is there something I'm missing?
# 2  
Old 07-31-2011
What particular user name string does find complain about?
# 3  
Old 07-31-2011
All of them. echo prints all the users in the list, and find give errors on all users.

file sample:

Code:
adm
bin
daemon
db2inst
db2inst1
dpower
esaadmin
ipsec
itmuser
mqbrk
mqm
nobody
snapp
sys
tdiuser
tivoli
wasadmin
wpsadmin

# 4  
Old 07-31-2011
I'm not sure what causes the error, because here could be several reasons, unprintable characters in your user-list file being probably the most common.

Still, there are some problems with your code anyway so it might be a good idea to correct these and test then:

1) old and deprecated syntax

backticks are only supported for backwards compatibility any more, so PLEASE don't use them: they are hard to read when mixed with quotation marks (single, double), they cannot be nested and they do have no advantage whatsoever for the modern way of doing the same: the "$(....)" construct. Actually this can do all the things backticks can not.

2) Your use of a "for"-loop

Bear in mind that a subshell invocation basically is expanded to text before the main command is parsed. That means: when the shell is evaluating a line first whatever is the result (output) of the command in the subshell is evaluated, then this replaces the subshell invocation, then the remaining command is evaluated.

It follows that all is fine as long as you don't hit the maximum length for input lines to the shell (usually 4096 or 8192 characters). If your list is really long the script will break with a "line too long" error.

As a general rule: if you work on lists of undetermined length do not use the "for"-loop but the "while"-loop with a pipeline. Instead of

Code:
for WORD in $(some process) ; do
   something $WORD
done

write

Code:
some process | while read WORD ; do
    something $WORD
done

3) Don't take variables for granted.

Yes, the shell allows this usage of variables that have not been declared before. No, you should still not rely on this mechanism. First, because it is a good idea to introduce variables explicitly with a "typeset"-statement, which gives you the opportunity to document what you write:

Code:
#! /bin/ksh
# this is a sample script

typeset USER=""             # buffer for cycling through users

cat /path/to/userlist | while read USER ; do
     do_something $USER
done

exit 0

This will explain beyond any doubt what "$USER" is used for. This is maintenance-friendly once you have longer and more complex scripts.

Second, because it allows to declare some properties of the variable explicitly (i.e. type integer with the "-i" option of typeset or "-x", which makes this variable known throughout subshells). It is even possible to format your variable with some of the options to "typeset" ("-L"= convert to lowercase, "-U" to uppercase, etc.)

So, after all this, here is how i would have written your script:

Code:
#! /bin/ksh

# some explanation of what it does here. Even more so if it is to be put in
# cron. To avoid the "number-one-cron-scripts-problem" *) you should habitually
# set your environment in every script.

. /etc/environment                   # set some standard environment

typeset chUser=""                    # buffer for cycling through user names
typeset fIn="/path/to/users.list" # file with user names, one at a line
typeset fOut="/path/to/result.out" # log file with output

cat "$fIn" |\
while read chUser ; do
     echo "$chUser" >> $fOut
     find /home -user "$chUser" >> $fOut
     find /var -user "$chUser"  >> $fOut
     find /opt -user "$chUser"  >> $fOut
     find /usr -user "$chUser"  >> $fOut
done

exit 0

I hope this helps.

bakunin

__________________

*) For an explanation of Cron Problem Number One

Last edited by bakunin; 07-31-2011 at 12:57 PM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Korn Shell Loop Problems

Very new to the Korn Shell, but I've been looking up loops online and it seems this should work. I'm just trying to convert an ip range in variables $A and $B and iterate the individual ip's out to new lines. Unfortunately I get {152..155} instead of 152, 153, 154, and 155. # for i in {$A..$B};... (8 Replies)
Discussion started by: Azrael
8 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

loop problems...

#!/bin/bashi function userrecord() { read -p "please enter a number: " a clear output=$(grep -w "$a" appraisalrecord) b=$(echo $a | tr -dc ) if ]; then echo -e "accepted\n" else echo -e "The input must be a numerical number\n" userrecord fi if ]; then echo -e "the ID has... (2 Replies)
Discussion started by: bassmasta1
2 Replies

4. UNIX for Dummies Questions & Answers

I'm having problems with a simple for loop on a newline

for i in `seq 1 10 ` ; do printf $i '\n'; done gives me this: 1234567891064mbarch ~ $ (output followed by bash prompt) :( I've tried so many ways to create a newline at the end. Does anyone have any ideas.. Thanks in advance. Sorry (7 Replies)
Discussion started by: 64mb
7 Replies

5. Shell Programming and Scripting

problems calling out variables in a loop

good afternoon forums. i have a problem that ive been trying to work out all morning and cant seem to get my head around it. what i have in my script is individual letters saved in different variables. so if the word unix was saved then 'u' would be stored in the variable 'wvar1' 'n' in 'wvar2'... (7 Replies)
Discussion started by: strasner
7 Replies

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

7. Shell Programming and Scripting

Problems with syntax in a loop (AWK)

Hi guys, I'm trying to loop through a number of files that is set by whatever is in a field. eg. The idea is to split FILELIST down into fields, it could contain 1 - 999 fields and it's bar delimited. I thought simple, count the number of fields in the field and then loop... (1 Reply)
Discussion started by: Peejay
1 Replies

8. Shell Programming and Scripting

while loop problems

I have a problem validating my script. The start of my script begins like this: then after this i have all of my script and functions. at the end i close the loop with this code: What i want to know is, how do i make the loop so that only Yes or no can be an answer? and if... (7 Replies)
Discussion started by: amatuer_lee_3
7 Replies

9. Shell Programming and Scripting

Problems with an if/then loop within a script

Hi there, I have written a script to clear out log files from the var/tmp dir. It works up to a point. What I needed to do was to exit the script if there was no files to be deleted. I can get this working on a test script but when I implement it into my program it errors out with a `then` not... (3 Replies)
Discussion started by: lodey
3 Replies

10. Shell Programming and Scripting

While loop problems

Here it wont terminate unless i take the not of my statement #!/bin/bash grabXML parseXML TAIL=5 #"$(cat dailyCasLog | tail -n 1)" COUNT=200 LINE=5 #"$(cat dailyCasLog | head -n $COUNT | tail -n 1)" echo $TAIL echo $LINE while ($LINE!=) do #$LINE">>currentLine folderMaker ... (0 Replies)
Discussion started by: rcunn87
0 Replies
Login or Register to Ask a Question