The UNIX and Linux Forums  
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.

Go Back   The UNIX and Linux Forums > Top Forums > Shell Programming and Scripting
.
google unix.com



Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here.

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Recognition of Eyes-free Handwriting Input for Pen and Touch Interfaces iBot UNIX and Linux RSS News 0 05-22-2008 10:00 PM
Eyes Of Lynx 0.3.0 (Default branch) iBot Software Releases - RSS News 0 05-14-2008 07:30 PM
exporting number into .csv file in text form (no other extra charc) from shell script Deepak_Rastogi Shell Programming and Scripting 5 03-13-2008 04:08 PM
Eyes Of Lynx 0.2.0 (Default branch) iBot Software Releases - RSS News 0 02-28-2008 04:20 PM
manipulating csv to add extra row neil546 Shell Programming and Scripting 3 07-16-2007 07:11 AM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Search this Thread Rate Thread Display Modes
  #1 (permalink)  
Old 04-22-2008
gzs553 gzs553 is offline VIP Member  
Supporter
  
 

Join Date: Oct 2006
Posts: 42
Cool 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 (permalink)  
Old 04-22-2008
vbe's Avatar
vbe vbe is offline Forum Staff  
Moderator
  
 

Join Date: Sep 2005
Location: Switzerland - GE
Posts: 1,574
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 (permalink)  
Old 04-22-2008
gzs553 gzs553 is offline VIP Member  
Supporter
  
 

Join Date: Oct 2006
Posts: 42
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 (permalink)  
Old 04-22-2008
era era is offline Forum Advisor  
Herder of Useless Cats (On Sabbatical)
  
 

Join Date: Mar 2008
Location: /there/is/only/bin/sh
Posts: 3,652
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 02:54 PM.. Reason: Code for revamped case statement, too; point out [code] tags
  #5 (permalink)  
Old 04-22-2008
gzs553 gzs553 is offline VIP Member  
Supporter
  
 

Join Date: Oct 2006
Posts: 42
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!!



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 (permalink)  
Old 04-22-2008
era era is offline Forum Advisor  
Herder of Useless Cats (On Sabbatical)
  
 

Join Date: Mar 2008
Location: /there/is/only/bin/sh
Posts: 3,652
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 (permalink)  
Old 04-22-2008
gzs553 gzs553 is offline VIP Member  
Supporter
  
 

Join Date: Oct 2006
Posts: 42
Still not functioning properly - Am I confused or what.


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
Sponsored Links
Closed Thread

Bookmarks

Tags
unix commands

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On




All times are GMT -4. The time now is 05:01 PM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited. Language Translations Powered by .
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
The UNIX and Linux Forums Content Copyright ©1993-2009. All Rights Reserved.Ad Management by RedTyger

Content Relevant URLs by vBSEO 3.2.0