While loop in a nested if returns 'do unmatched'


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers While loop in a nested if returns 'do unmatched'
# 1  
Old 09-07-2008
While loop in a nested if returns 'do unmatched'

I have a file called /ACCT/users that holds information on accounts to be created line by line.

I'm trying to create accounts and change the password to a generic password.

I want to probe the /etc/passwd file to check if there is already a user with the name i'm trying to create and if there is to create the new one with a one on the end.

But i'm having trouble with the while loop in the nested if statement.

It comes back with 'do unmatched' and i have no idea how to match it from an if statement.

I have only been at scripting for about 3 weeks now so if i have gone the complete wrong way about things please go easy on me.

But to go from knowing absolutely nothing to this in 3 weeks aint bad.


Code:
#! /bin/ksh

clear
echo "Enter location of home directory"
echo
read dir
            if [ ! -d ${dir} ]; then
      
            echo
            echo "**********************************************"
            echo "*The home directory specified does not exist!*"
            echo "**********************************************"
            echo
            echo "Directory ${dir} needs to be created"
            echo "to continue!"
            echo
            echo "Press <y> to create or <n> to exit"
            echo 
            read INPUT        

                  if [ ! $INPUT = "y" ]; then
                  echo "User must have home dir."
                  echo "press any key to start again"
                  read b
                  /ACCT/use
                  fi
            fi
echo "Enter location of file where user information is kept."
read user

if [ -s $user ]; then
      echo
      echo $home
            while read user
            do
                  in=`echo $user |cut -c1`
                  sur=.`echo $user |cut -d" " -f2`
                  com=`echo $user |cut -d: -f2`
                  gid=`echo $user |cut -d: -f3`
                  ACCT=${in}${sur}
                  echo "account $ACCT"
                  echo "comment: $com"
                  ver=`grep ${ACCT}: "/etc/passwd"
                        if [ -n $ver ]
                        then
                        useradd -g ${gid} -d ${home}/${ACCT}1 -m -s /bin/bash -c "${com}" ${ACCT}1
                        chown -R ${ACCT} ${home}/${ACCT}
                        chgrp -R ${gid} ${home}/${ACCT}
                        chmod 755 ${home}/${ACCT}
                        echo "Account ${ACCT} created."
                        echo
                        done < $user
                        else
                              useradd -g ${gid} -d ${home}/${ACCT} -m -s /bin/bash -c "${com}" ${ACCT}
                              chown -R ${ACCT} ${home}/${ACCT}
                              chgrp -R ${gid} ${home}/${ACCT}
                              chmod 755 ${home}/${ACCT}
                              echo "Account ${ACCT} created."
                              echo
                              done < $user
                        fi
else
echo "File $user does not exist"
echo "Setup cannot contine"
echo "Press enter to return to main menu"
read
/ACCT/CASE
fi

tp1=`sed -n 1p $user |cut -c1`
tp2=.`sed -n 1p $user |cut -d" " -f2`
pass=$tp1$tp2
passwd $pass
PASSWORD=`grep "$pass" /etc/shadow |cut -d: -f2`

while read user;
      do
            int=`echo $user |cut -c1`
            surt=.`echo $user |cut -d" " -f2`
            ACCT=${int}${surt}
            ed /etc/shadow <<EOF
            g/${ACCT}:/s/:\*LK\*:/:${PASSWORD}:
w
q
EOF
            
done < $user

echo "The following accounts have been created sucsesfuly"
ver=`grep ${ACCT}: "/etc/passwd"
      if [ -n $ver ]; then
      echo `grep " " ${userd}1 |cut -d: -f1`
      fi
echo `grep " " $user |cut -d: -f1`
echo
echo "Press enter to return to the main menu"
echo
read
/ACCT/CASE

# 2  
Old 09-07-2008
While it would be cool if you could use the 'done' keyword like you are here, it's not actually valid syntax (as it's not a 'command' as such).
Just move all the stuff that's common to both parts of the if..else outside the fi keyword
Code:
...
while read user
do
  in=`echo $user |cut -c1`
  ...
  if [ -n $ver ]
  then
    useradd -g ${gid} -d ${home}/${ACCT}1 -m -s /bin/bash -c "${com}" ${ACCT}1
  else
    useradd -g ${gid} -d ${home}/${ACCT} -m -s /bin/bash -c "${com}" ${ACCT}
  fi
  chown -R ${ACCT} ${home}/${ACCT}
  chgrp -R ${gid} ${home}/${ACCT}
  chmod 755 ${home}/${ACCT}
  echo "Account ${ACCT} created."
  echo
done < $user
...

Or (depending on your actual goal):
Code:
while read user
do
  in=`echo $user |cut -c1`
  ...
  if [ -n $ver ]
  then
    ACCT="${ACCT}1"
  fi
  useradd -g ${gid} -d ${home}/${ACCT} -m -s /bin/bash -c "${com}" ${ACCT}
  chown -R ${ACCT} ${home}/${ACCT}
  chgrp -R ${gid} ${home}/${ACCT}
  chmod 755 ${home}/${ACCT}
  echo "Account ${ACCT} created."
  echo
done < $user

# 3  
Old 09-07-2008
What is:
Code:
done < $user

intended to accomplish?

Without going too deeply into your code, let me just point you in the right direction: each "if" needs a "then" and a "fi", and each "while" needs both a "do" and a "done".
# 4  
Old 09-08-2008
Quote:
Originally Posted by BMDan
What is:
Code:
done < $user

intended to accomplish?
Restarts the while loop, passing $user to it (which is pulled apart line by line by the read).
Quote:
Originally Posted by BMDan
Without going too deeply into your code, let me just point you in the right direction: each "if" needs a "then" and a "fi", and each "while" needs both a "do" and a "done".
The O/P has a 'do' and 'done' for each 'while', and the appropriate mix of 'fi's 'if's and 'then's. The issue is that they are not correctly nested - the parent is closed before the child.
# 5  
Old 09-08-2008
I fuond out why i was crap ver=`grep ${ACCT}: "/etc/passwd"

was not closed.

Thanks for the comment on using just the ACCT="${ACCT}1"
that cut donw some lines.

But now i have another problem.

After the script have finished reading the $user file it hands and wont continue on to the next section of the script.

What would casue this?
# 6  
Old 09-08-2008
Quote:
Originally Posted by switchkill
After the script have finished reading the $user file it hands and wont continue on to the next section of the script.
Have you fixed the issue of the mixed up nesting yet? It'll not work correctly until you get the if-then-fi completly contained within the while-do-done.
Post the current version of the code to save confusion Smilie
# 7  
Old 09-08-2008
<CODE>
#! /bin/ksh

clear
echo "Enter location of home directory"
echo
read home
if [ ! -d ${home} ]; then

echo
echo "**********************************************"
echo "*The home directory specified does not exist!*"
echo "**********************************************"
echo
echo "Directory ${dir} needs to be created"
echo "to continue!"
echo
echo "Press <y> to create or <n> to exit"
echo
read INPUT

if [ ! $INPUT = "y" ]; then
echo "User must have home dir."
echo "press any key to start again"
read b
/ACCT/use
fi
mkdir -p ${home}
fi
echo "Enter location of file where user information is kept."
read user

if [ -s $user ]; then
echo
echo $home
while read user
do
in=`echo $user |cut -c1`
sur=.`echo $user |cut -d" " -f2`
com=`echo $user |cut -d: -f2`
gid=`echo $user |cut -d: -f3`
ACCT=${in}${sur}
echo "account $ACCT"
echo "comment: $com"
ver=`grep ${ACCT}: "/etc/passwd"`
if [ ! -n $ver ]
then
ACCT="${ACCT}1"
fi
useradd -g ${gid} -d ${home}/${ACCT} -m -s /bin/bash -c "${com}" ${ACCT}
chown -R ${ACCT} ${home}/${ACCT}
chgrp -R ${gid} ${home}/${ACCT}
chmod 755 ${home}/${ACCT}
echo "Account ${ACCT} created."
echo
done < ${user}
else
echo "File $user does not exist"
echo "Setup cannot contine"
echo "Press enter to return to main menu"
read
/ACCT/CASE
fi
tp1=`sed -n 1p $user |cut -c1`
tp2=.`sed -n 1p $user |cut -d" " -f2`
passw=${tp1}${tp2}
passwd ${passw}
PASSWORD=`grep "$passw" /etc/shadow |cut -d: -f2`

while read user
do
int=`echo $user |cut -c1`
surt=.`echo $user |cut -d" " -f2`
ACCT=${int}${surt}
ed /etc/shadow <<EOF
g/${ACCT}:/s/:\*LK\*:/:${PASSWORD}:
w
q
EOF

done < $user

echo "The following accounts have been created sucsesfuly"
ver=`grep ${ACCT}: "/etc/passwd"
if [ -n $ver ]; then
echo `grep " " ${userd}1 |cut -d: -f1`
fi
echo `grep " " $user |cut -d: -f1`
echo
echo "Press enter to return to the main menu"
echo
read
/ACCT/CASE
</CODE>
 
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Nested loop -bash

I am using the following nested loop for i in {1..3} do for y in {1..3} do if ; then echo P0${i}R${y}.fas mv P0${i}R${y}.fas P${i}R${y}.fas read -t 5 fi done done I was wondering if I can use a character such as * or ? instead of my second variable y. I tried R in... (3 Replies)
Discussion started by: Xterra
3 Replies

2. Programming

MPI C++ in a nested loop

I have a MPI program like this: void slave1(int j){ MPI_Status status; MPI_Recv(&j,1,MPI_INT,0,0,MPI_COMM_WORLD,&status);} void slave2(int j){ MPI_Status status; MPI_Recv(&j,1,MPI_INT,0,1,MPI_COMM_WORLD,&status);} int main(int argc, char *argv){ int numprocs, rank; ... (0 Replies)
Discussion started by: wanliushao
0 Replies

3. Shell Programming and Scripting

Nested if loop

Hi Team, I just want to check whether my nested if loop used is correct or not. if ] if ] export1 else export2 fi else if ] export3 else export4 fi fi Thanks Shiva (5 Replies)
Discussion started by: shivashankar_S
5 Replies

4. Shell Programming and Scripting

Nested for loop in bash

Hi, How to use values in one for loop to other for loop. say "$sf_rel" variable has values "2011/W2 2011/G2" I want to use these values in inner for loop to process properly. $branch variable has G2 and 6 What is happening is outer for loop $i has 2011/W2 it is entering into inner... (3 Replies)
Discussion started by: Anjan1
3 Replies

5. Shell Programming and Scripting

for loop returns more output with awk

I need to get total number of hdisk not assigned to any VGs. PDC # lspv |grep None |awk '{print $1}' |wc 131 131 1099 So, it shows 131 hdisks. I need to look at the individual hdisk fget_config info like below: PDC # fget_config -Av |grep hdisk230 hdisk230 dac1 229... (4 Replies)
Discussion started by: Daniel Gate
4 Replies

6. Shell Programming and Scripting

Nested loop in Unix

Hi, I have the following script which is two while loops, but it is working only for the Inner loop without going back to the outer loop. the aim of this script is to remove data files from memory after each five times for each setting of the rotate parameter #!/bin/csh set hdir =... (1 Reply)
Discussion started by: moon218
1 Replies

7. Shell Programming and Scripting

Nested Loop becomes slow

Hello I have some nested loop to display files and form menu item. The part of the code is below. I found that after runnining the script for a while the display becomes very slow. Does ksh shell provided any easy way to release variables, reinit, etc. while ];do script=0 ... (2 Replies)
Discussion started by: ekb
2 Replies

8. Shell Programming and Scripting

Variable in While Loop Nested If

Hi all, I'm having problems with the setting a variable in a nested if statement. It doesn't seem to change even if it mets the 'if' condition. My script essentially looks for a user name from the output from a kerberos command. When I find the user name, I tried to change a variable and exit... (6 Replies)
Discussion started by: geass
6 Replies

9. Shell Programming and Scripting

nested loop

I have two do loops. When I break of the inner loop it doesn't go back to the outer loop but exit the program. (5 Replies)
Discussion started by: chinog
5 Replies
Login or Register to Ask a Question