done' unexpected and do' unmatched

Good morning,

I have been teaching myself shell scripting and seem to be stuck here. I am sure I am just blind and not seeing it so I thought maybe some fresh eyes would help. With the script below I keep getting....
"syntax error at line 248 : `done' unexpected"

I am not seeing why this would be unexpected since there is a do statement. In fact if I comment it out I then get this.....
"syntax error at line 180 : `do' unmatched"

Seems I can not win either way...
Could somebody please show me what I am missing here?

Thank you in advance.

#!/bin/ksh
. /lcl/apps/Tivoli/netcool/etc/env_omni_sit
EIF_HOME=/lcl/apps/Tivoli/eif;export EIF_HOME


ps -ef | grep ora_pmon | grep -v grep | awk '{print $NF}' | awk -F_ '{print $NF}' > $OMNIHOME/bin/pmonfile.dat
set -A pmon_array
dbfile_name='pmonfile.dat'
i=0
host=`hostname`
while read dbname
do
	pmon_array=${dbname}
	i=`expr ${i} + 1`
done < $OMNIHOME/bin/${dbfile_name}
i=0
 

ps -ef | grep nco_p_syslog | grep -v grep | awk '{print $NF}' | awk -F. '{print $1}' > $OMNIHOME/bin/syslogfile.dat
set -A syslog_array
syslogfile_name='syslogfile.dat'
k=0
while read syslogname
do
	syslog_array[k]=${syslogname}
	k=`expr ${k} + 1`
done < $OMNIHOME/bin/${syslogfile_name}
k=0


if [ ${#pmon_array[*]} > 0 ]; then
    while [ ${i} -lt ${#pmon_array[*]} ]
    do
	x=${pmon_array}
	dbmatch='no'


if [ -e $OMNIHOME/probes/solaris2/syslog.$x.props ]; then
	if [ ${#syslog_array[*]} = 0 ]; then
           $OMNIHOME/probes/nco_p_syslog -manager $x.syslog -propsfile $OMNIHOME/probes/solaris2/syslog.$x.props &
	else
            k=0  
	    while [ ${k} -lt ${#syslog_array[*]} ]
	    do
		if [ ${pmon_array} == ${syslog_array[k]} ]; then
			dbmatch='yes'
		fi
		k=`expr ${k} + 1`
	    done
	    if [ $dbmatch = 'no' ]; then
		$OMNIHOME/probes/nco_p_syslog -manager $x.syslog -propsfile $OMNIHOME/probes/solaris2/syslog.$x.props &
	    fi
	fi
        i=`expr ${i} + 1`
      else


       $EIF_HOME/bin/solaris2/postzmsg -f $EIF_HOME/eif.conf -r CRITICAL -m "Unable to start the $x probe because the syslog.$x.props file does not exist on server $host" OnCallGroup="INFR_Apps" ISOC_Instructions="Please contact INFR_APPS on-call as properties file for a syslog database probe on the server needs to be created" SyslogPropsFileCheck SysCleanup
	i=`expr ${i} + 1`
      fi
    done
fi


ps -ef | grep nco_p_syslog | grep -v grep | awk '{print $NF}' | awk -F. '{print $1}' > $OMNIHOME/bin/syslogfile.dat
set -A syslog_array2
syslogfile_name='syslogfile.dat'
k=0


while read syslogname
do
        syslog_array2[k]=${syslogname}
        k=`expr ${k} + 1`
done < $OMNIHOME/bin/${syslogfile_name}
k=0
i=0


if [ ${#syslog_array2[*]} > 0 ]; then
	while [ ${i} -lt ${#syslog_array2[*]} ]
	do
		x=${syslog_array2}
		dbmatch='no'

        
		if [ ${#pmon_array[*]} = 0 ]; then
			ps -ef | grep nco_p_syslog | grep $x | awk '{print $2}' | xargs kill
		else
			k=0
			while [ ${k} -lt ${#pmon_array[*]} ]
			do
				if [ ${syslog_array2} == ${pmon_array[k]} ]; then
					dbmatch='yes'
				fi
				k=`expr ${k} + 1`
			done
			if [ $dbmatch = 'no' ]; then
		                
        				sleep 60 
		       

ps -ef | grep ora_pmon | grep -v grep | awk '{print $NF}' | awk -F_ '{print $NF}' > $OMNIHOME/bin/pmonfile.dat
set -A pmon_array
dbfile_name='pmonfile.dat'
l=0
host=`hostname`
while read dbname
do
        pmon_array[l]=${dbname}
        l=`expr ${l} + 1`
done < $OMNIHOME/bin/${dbfile_name}
k=0
                        while [ ${k} -lt ${#pmon_array[*]} ]
                        do
                                if [ ${syslog_array2} == ${pmon_array[k]} ]; then
                                        dbmatch='yes'
                                fi
                                k=`expr ${k} + 1`
                        done
                        if [ $dbmatch = 'no' ]; then
        
		        ps -ef | grep nco_p_syslog | grep $x | awk '{print $2}'  | xargs kill
			 fi
                fi
                i=`expr ${i} + 1`
        done
fi

I deleted a bunch of lines from the script. If you look at what's left you can see that you're missing a "fi".

Also, that test [ ${#syslog_array2[*]} > 0 ] is going to redirect its null output to a file named 0.

if [ ${#syslog_array2[*]} > 0 ]; then
        while [ ${i} -lt ${#syslog_array2[*]} ]
        do
                x=${syslog_array2}
                dbmatch='no'


                if [ ${#pmon_array[*]} = 0 ]; then
                        ps -ef | grep nco_p_syslog | grep $x | awk '{print $2}' | xargs kill
                else
                        k=0
                        while [ ${k} -lt ${#pmon_array[*]} ]
                        do
                                if [ ${syslog_array2} == ${pmon_array[k]} ]; then
                                        dbmatch='yes'
                                fi
                                k=`expr ${k} + 1`
                        done
                        if [ $dbmatch = 'no' ]; then

                                        sleep 60

                fi
                i=`expr ${i} + 1`
        done
fi

Hhhhhmmmm I must be blind. I am not seeing it? :confused:

where's the matching 'fi' for this:

                        if [ $dbmatch = 'no' ]; then

                                        sleep 60


That is where I thought you might be talking about and I tried this....

 ps -ef | grep nco_p_syslog | grep $x | awk '{print $2}'  | xargs kill
                        fi
                fi
                i=`expr ${i} + 1`
        done
fi

But it returns with....
syntax error at line 260 : `done' unexpected

I would think it should look like this....

if [ ${#syslog_array2[*]} > 0 ]; then
	while [ ${i} -lt ${#syslog_array2[*]} ]
	do
		x=${syslog_array2}
		dbmatch='no'

        
		if [ ${#pmon_array[*]} = 0 ]; then
			ps -ef | grep nco_p_syslog | grep $x | awk '{print $2}' | xargs kill
		else
			k=0
			while [ ${k} -lt ${#pmon_array[*]} ]
			do
				if [ ${syslog_array2} == ${pmon_array[k]} ]; then
					dbmatch='yes'
				fi
				k=`expr ${k} + 1`
			done
			if [ $dbmatch = 'no' ]; then
		                
        				sleep 60 
		       

ps -ef | grep ora_pmon | grep -v grep | awk '{print $NF}' | awk -F_ '{print $NF}' > $OMNIHOME/bin/pmonfile.dat
set -A pmon_array
dbfile_name='pmonfile.dat'
l=0
host=`hostname`
while read dbname
do
        pmon_array[l]=${dbname}
        l=`expr ${l} + 1`
done < $OMNIHOME/bin/${dbfile_name}
k=0
                        while [ ${k} -lt ${#pmon_array[*]} ]
                        do
                                if [ ${syslog_array2} == ${pmon_array[k]} ]; then
                                        dbmatch='yes'
                                fi
                                k=`expr ${k} + 1`
                        done
                        if [ $dbmatch = 'no' ]; then
        
		        ps -ef | grep nco_p_syslog | grep $x | awk '{print $2}'  | xargs kill
		    fi
                fi
                i=`expr ${i} + 1`
        done
fi

I think you are missing the 'fi' right before your last done:

if [ ${#syslog_array2[]} > 0 ]; then
while [ ${i} -lt ${#syslog_array2[
]} ]
do
x=${syslog_array2[i]}
dbmatch='no'

    if [ $\{\#pmon_array[*]\} = 0 ]; then
       ps -ef | grep nco\_p_syslog | grep $x | awk '\{print $2\}' | xargs kill
    else
       k=0
       while [ $\{k\} -lt $\{\#pmon_array[*]\} ]
       do
          if [ $\{syslog_array2[i]\} == $\{pmon_array[k]\} ]; then
             dbmatch='yes'
          fi
          k=\`expr $\{k\} \+ 1\`
       done

       if [ $dbmatch = 'no' ]; then
          sleep 60
          ps -ef | grep ora_pmon | grep -v grep | awk '\{print $NF\}' |\\
          awk -F_ '\{print $NF\}' &gt; $OMNIHOME/bin/pmonfile.dat
          set -A pmon_array 
          dbfile_name='pmonfile.dat' 
          l=0
          host=\`hostname\`
          while read dbname
          do
             pmon_array[l]=$\{dbname\}
             l=\`expr $\{l\} \+ 1\`
             done &lt; $OMNIHOME/bin/$\{dbfile_name\}

             k=0

          while [ $\{k\} -lt $\{\#pmon_array[*]\} ]
          do
             if [ $\{syslog_array2[i]\} == $\{pmon_array[k]\} ]; then
                dbmatch='yes'
             fi
             k=\`expr $\{k\} \+ 1\`
          done
       
          if [ $dbmatch = 'no' ]; then
             ps -ef | grep nco\_p_syslog | grep $x | awk '\{print $2\}'  | xargs kill
          fi
       fi

       i=\`expr $\{i\} \+ 1\`
    fi
 done

fi

Yeah I had just figured it out when you posted :slight_smile:

Thank you for the help though.

ps -ef | grep nco_p_syslog | grep $x | awk '{print $2}' | xargs kill
fi
fi
i=`expr ${i} + 1`
fi
done
fi