Need some help with this script -- extra eyes


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Need some help with this script -- extra eyes
# 1  
Old 04-22-2008
Tools Need some help with this script -- extra eyes

I have two issues with this script.
1. I cannot seem to get my counters to count correctly.
2. My function to eject to CAP1 or CAP2 is hung in a loop and doens't exit back to the previous function. I would like to be able to select which cap to eject to . Each cap holds only 40 tapes, so when one becomes full, I want to be able to eject to the next.
Thanks

I'd appreciate some help.



# This scripts ejects IP tapes from the STK9310 silo via ACSLS Commands from plebsb01.
# Scripter : 1/31/07
#!/bin/ksh
#set -x
rpt=/export/home/legato/tapemgr/rpts/offsite
dat=`date +"%m%d%y"`
rdat=`date +"%b%d%y_%H%M%S"`
EJECTED_TAPES="$rpt/ejected/eject_tapes_test.041608"
OFFSITE_RPT="$rpt/Offsite.rpt.041608"
EJECT_LOG=$rpt/ejected/ejected_tape.status.log.041608
TOT_TAPE_CT_EJECTED=0
TAPE_CT=0
CAP_TOTAL=40
EJECT40=ejectupto40.log
cat /dev/null > $EJECT040


#--------------------------------------
# L O C A L F U N C T I O N S . . .
#--------------------------------------

EJECT_CAP1()
{
echo "Ejecting to CAP 0,2,1"
# /opt/OMIdtelm/bin/eject_vol -t 3600 -c 0,2,1 -l $EJECTED_TAPES | tee $EJECT_LOG;
echo "Ejecting Completed"
}
EJECT_CAP1()
{
echo "Ejecting to CAP 0,2,2"
# /opt/OMIdtelm/bin/eject_vol -t 3600 -c 0,2,2 -l $EJECTED_TAPES | tee $EJECT_LOG;
echo "Ejecting Completed"
}

#---------------------- EJECT TO CAP FUNCTION ROUTINE ---------------------------
#

EJECT_TO_CAP()
{
echo "EJECT_TO_CAP Routine _ List of tapes to be ejected to cap 0,2,1"; cat $EJECT40
TOT_TAPE_CT_EJECTED=`cat $EJECT40 | wc -l` ; echo $TOT_TAPE_CT_EJECTED
echo " CURRENT tapes Ejected $TAPE_CT of $TOT_TAPES_TO_EJECT"; sleep 1

echo "Select TAPE CAP TO Eject to: Enter 1 for CAP1 or 2 for CAP2 (1,2)"; read cap_option
echo $cap_option
case $cap_option in
1) EJECT_CAP1 ;;
2) EJECT_CAP2 ;;
*) echo "Invalid Selection - Please Re-enter"
esac
cat $EJECT40 >> TAPES_EJECTED.log
cat /dev/null >$EJECT40
sleep 5
}

#------------------------------------------- MAIN ROUTINE
#------------------------------------------

TAPE_ROUTINE ()
{
while read volume until EOF
do
#TAPE_CT=`expr $TAPE_CT + 1`
echo " In tape routine volume ejected $volume TAPE $TAPE_CT of $TOT_TAPES_TO_EJECT"
if [ $TAPE_CT != $CAP_TOTAL ]
then
echo $volume >> $EJECT40
else
echo $volume >> $EJECT40
echo "$TAPE_CT of $TOT_TAPES_TO_EJECT Tapes Ejected CAP is FULL";
EJECT_TO_CAP
TAPE_CT=0
fi
TAPE_CT=`expr $TAPE_CT + 1`
done < $EJECTED_TAPES
EJECT_TO_CAP

TOT_TAPE_CT_EJECTED=`expr $TAPE_CT + $TOT_TAPES_TO_EJECT`
echo " END of Tape Routine .. Total Tapes Ejected >>> $TOT_TAPES_TO_EJECT of $TOT_TAPE_CT_EJECTED"

echo "Total tapes ejected: $TOT_TAPE_CT_EJECTED" >> TAPES_EJECTED.log
mv TAPES_EJECTED.log TOT_TAPES_EJECTED.rpt.$rdat
}


#--------------------------------------
# M A I N . . .
#--------------------------------------
cat $EJECTED_TAPES
TOT_TAPES_TO_EJECT=`cat $EJECTED_TAPES |wc -l`
echo "Total Tapes to eject is: $TOT_TAPES_TO_EJECT ";
echo " Is this the correct list of tapes to eject (y/n)?"
read option
case $option in
y|Y) TAPE_ROUTINE;;
n|N) exit
esac

exit 0
# 2  
Old 04-22-2008
EJECT_CAP2 doesnt exist for a start: Correct your script where you declare this function
(theres 2 EJECT_CAP1 () )
Then try again, it may only be that...
# 3  
Old 04-22-2008
Need extra help on this script.

Corrected the function and still not functioning properly.
Will not allow me to stop and read and continue.
# 4  
Old 04-22-2008
Maybe you could elaborate a bit on where exactly the problem is?

I don't think I have found your actual problem, but I have a number of comments on the code. Maybe a few of these will help also solve your problem, either coincidentally or by simplifying something which got too complex at some point.

Quote:
# This scripts ejects IP tapes from the STK9310 silo via ACSLS Commands from plebsb01.
# Scripter : 1/31/07
#!/bin/ksh
The #!/bin/ksh line needs to be the very first line of the script.
Quote:
EJECT_CAP1()
{
echo "Ejecting to CAP 0,2,1"
# /opt/OMIdtelm/bin/eject_vol -t 3600 -c 0,2,1 -l $EJECTED_TAPES | tee $EJECT_LOG;
echo "Ejecting Completed"
}
EJECT_CAP1()
{
echo "Ejecting to CAP 0,2,2"
# /opt/OMIdtelm/bin/eject_vol -t 3600 -c 0,2,2 -l $EJECTED_TAPES | tee $EJECT_LOG;
echo "Ejecting Completed"
}
This is not very modular. How about a single EJECT function which you'd call with an argument which is either 1 or 2?

Code:
EJECT ()
{
    local cap
    cap=$1
    echo "Ejecting to CAP 0,2,$cap"
    # /opt/OMIdtelm/bin/eject_vol -t 3600 -c 0,2,$cap -l $EJECTED_TAPES | tee $EJECT_LOG;
    echo "Ejecting Completed"
}

So further down in the script you would have EJECT 1 or EJECT 2 (or simply pass whatever number the user supplied, if it's within range -- anyway, you need to adapt the rest of the script, obviously).

Quote:
TOT_TAPE_CT_EJECTED=`cat $EJECT40 | wc -l`
You have this idiom throughout. This is known as Useless Use of Cat. You can just as well say `wc -l <$EJECT40`

Quote:
echo "Select TAPE CAP TO Eject to: Enter 1 for CAP1 or 2 for CAP2 (1,2)"; read cap_option
echo $cap_option
case $cap_option in
1) EJECT_CAP1 ;;
2) EJECT_CAP2 ;;
*) echo "Invalid Selection - Please Re-enter"
esac
This looks like it's supposed to loop back and ask again if the option was not valid. You could simply "return" from the function at that point in case of invalid input to at least avoid manipulating the log etc when nothing was actually done. Or put this in an endless while true loop and break out of the loop when a valid option was selected.

Code:
echo "Select TAPE CAP TO Eject to: Enter 1 for CAP1 or 2 for CAP2 (1,2)"
while true; do
    read cap_option
    case $cap_option in
      1 | 2) EJECT $cap_option; break;;
      *) echo "Invalid Selection - Please Re-enter";;
    esac
done

This also incorporates the new modular EJECT function from above. I left out the echo because the user's own input will already be visible on the screen. (I'd take out a few of those sleeps, too.)

Quote:
while read volume until EOF
I suppose this is supposed to be like this, read three space-separated fields into $volume, $until, and $EOF -- or is this pseudo-code?

PS. Please use code tags, especially when posting long programs

Last edited by era; 04-22-2008 at 03:54 PM.. Reason: Code for revamped case statement, too; point out [code] tags
# 5  
Old 04-22-2008
Still not functioning properly.

It seems as though my "EJECT_TO_CAP" routine will not read my input, but just continously loops with my $volume variable. Not sure where it is picking up the input from. I guess I've been working on this script too long. lol... Any other ideas!!Smilie



rpt=/export/home/legato/tapemgr/rpts/offsite
dat=`date +"%m%d%y"`
rdat=`date +"%b%d%y_%H%M%S"`
EJECTED_TAPES="$rpt/ejected/eject_tapes_test.041608"
OFFSITE_RPT="$rpt/Offsite.rpt.041608"
EJECT_LOG=$rpt/ejected/ejected_tape.status.log.041608
TOT_TAPE_CT_EJECTED=0
TAPE_CT=0
CAP_TOTAL=40
EJECT40=ejectupto40.log
cat /dev/null > $EJECT040


#--------------------------------------
# L O C A L F U N C T I O N S . . .
#--------------------------------------

EJECT()
{
cap=$1
echo "Ejecting to CAP 0,2,$cap"; cat $EJECT40
TOT_TAPE_CT_EJECTED=`cat $EJECT40 | wc -l` ; echo $TOT_TAPE_CT_EJECTED
echo " CURRENT tapes Ejected $TAPE_CT of $TOT_TAPES_TO_EJECT"; sleep 1
# /opt/OMIdtelm/bin/eject_vol -t 3600 -c 0,2,1 -l $EJECTED_TAPES | tee $EJECT_LOG;
echo "Ejecting Completed"
cat $EJECT40 >> TAPES_EJECTED.log
cat /dev/null >$EJECT40
}

#---------------- SELECT CAP to EJECT ---------------------------
#

EJECT_TO_CAP()
{
#echo "EJECT_TO_CAP Routine _ List of tapes to be ejected to cap 0,2,1"; cat $EJECT40

echo "Select TAPE CAP TO Eject to: Enter 1 for CAP1 or 2 for CAP2 (1,2)"
while true; do
read cap
case $cap in
1 | 2) EJECT ; break;;
*) echo "Invalid Selection";;
esac
done
}

#------------ MAIN ROUTINE
# Reads file for number of tapes to eject, when reads 40 volumes, it ejects tapes and continue till EOF ------

TAPE_ROUTINE ()
{
while read volume until EOF
do
#TAPE_CT=`expr $TAPE_CT + 1`
echo " In tape routine volume ejected $volume TAPE $TAPE_CT of $TOT_TAPES_TO_EJECT"
if [ $TAPE_CT != $CAP_TOTAL ]
then
echo $volume >> $EJECT40
else
echo $volume >> $EJECT40
echo "$TAPE_CT of $TOT_TAPES_TO_EJECT Tapes Ejected CAP is FULL";
EJECT_TO_CAP
TAPE_CT=0
fi
TAPE_CT=`expr $TAPE_CT + 1`
done < $EJECTED_TAPES
EJECT_TO_CAP

TOT_TAPE_CT_EJECTED=`expr $TAPE_CT + $TOT_TAPES_TO_EJECT`
echo " END of Tape Routine .. Total Tapes Ejected >>> $TOT_TAPES_TO_EJECT of $TOT_TAPE_CT_EJECTED"

echo "Total tapes ejected: $TOT_TAPE_CT_EJECTED" >> TAPES_EJECTED.log
mv TAPES_EJECTED.log TOT_TAPES_EJECTED.rpt.$rdat
}


#--------------------------------------
# M A I N . . .
#--------------------------------------
cat $EJECTED_TAPES
TOT_TAPES_TO_EJECT=`cat $EJECTED_TAPES |wc -l`
echo "Total Tapes to eject is: $TOT_TAPES_TO_EJECT ";
echo " Is this the correct list of tapes to eject (y/n)?"
read option
case $option in
y|Y) TAPE_ROUTINE;;
n|N) exit
esac
# 6  
Old 04-22-2008
You're not passing the argument like EJECT $cap but that's again probably not the main problem.

Can you add debug prints to see what it's doing and what the variables' values are?
# 7  
Old 04-22-2008
Still not functioning properly - Am I confused or what.

Smilie
This is the output that I am getting:
When my TAPE_CT = 40 it goes to EJECT_TO_CAP, but never allows me to input my parameter and continues loops picking up the name of each $volume.
Any idea's?


+ EJECT_TO_CAP
+ echo Select TAPE CAP TO Eject to: Enter 1 for CAP1 or 2 for CAP2 (1,2)
Select TAPE CAP TO Eject to: Enter 1 for CAP1 or 2 for CAP2 (1,2)
+ true
+ read cap
+ echo TPA010
TPA010
+ echo Invalid Selection
Invalid Selection
+ true
+ read cap
+ echo TPA011
TPA011
+ echo Invalid Selection
Invalid Selection
+ true
+ read cap
+ echo TPA023
Login or Register to Ask a Question

Previous Thread | Next Thread

7 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Script when scheduled in Crontab gives extra records in output

Hi, We have created a script that's checks the latency of IIDR subscription by fetching details from a config file (that contains subscription details) and running the CHCCLP command. The out put is then concatenated in a csv file. Once all subscription details are saved the script send a mail... (7 Replies)
Discussion started by: ab095
7 Replies

2. Shell Programming and Scripting

Would appreciate a quick second set of eyes on a script (regarding doing things in the background)

What I'm trying to do is leave a tcpdump running all the time on a server, and at the end of every day kill it and start a new one. For some reason my boss doesn't want to set this up as a cron job, so I've come up with the following.: #!/bin/bash PCAPFILE=/tmp/mgmt.$(date... (8 Replies)
Discussion started by: DeCoTwc
8 Replies

3. Shell Programming and Scripting

The same script with extra variables seems to fail

Hey everyone, I have a problem with a certain shellscript. I have a script like this: #!/bin/sh template=$1 for values in {60,150,240,330}\ {60,150,240,330}\ {60,150,240,330}\ {60,150,240,330}; do set $values X=$1; Y=$2; Z=$3; M=$4 mkdir "X$X-Y$Y-Z$Z-M$M" cp... (2 Replies)
Discussion started by: mario8eren
2 Replies

4. Shell Programming and Scripting

Broke Perl Script Second pair of eyes NET::FTPSSL

Hi all, Let me first start out by saying I'm a perl newbie and hope somebody can help, for the life of me I can't figure out why my script will not find and download a remote file via FTPSSL. What it's supposed to do is find the latest file named... (4 Replies)
Discussion started by: Styles
4 Replies

5. Shell Programming and Scripting

Extra output in the script

Hi , I am trying to execute the following script. #!/bin/sh find . -name "common.log.diff" if ; then cp common.log common.log.diff diff common.log common.log.diff > DIFFERENCE.log cp common.log common.log.diff grep "ERROR" DIFFERENCE.log if ; then echo "1" else echo "0" fi... (5 Replies)
Discussion started by: himvat
5 Replies

6. Programming

Another set of eyes

Original code used fwrite instead of putc. What is expected is that the destination file will be written to. Instead I end up with a zero length file. I'm sure there is something simple I'm missing. tia. #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char... (6 Replies)
Discussion started by: ramen_noodle
6 Replies

7. What is on Your Mind?

use ears to protect eyes before the computer.

If you listen to the files on the computer with ears, your eyes are protected. Microsoft Text-To-Speech(TTS) voice engine has been installed by default on Windows 2000, XP, Vista, you can find what voice engines have been installed on the computer by following Control Panel->Speech->Speech... (0 Replies)
Discussion started by: tgst
0 Replies
Login or Register to Ask a Question