getopts

I have a script which fires a command based on certain parameters. I am posting the code below..

The options needs be given such that
-u option goes along with -d and -s, -f goes with -d and -t goes with -s and -d.
1) How do I ensure that user misses any of the option then he should be prompted . Is it simple if then else where I check the length of string of all these options.

USAGE="Usage: `basename $0` [-s schemaname] [-d databasename] [-u username] -f -t -h"
while getopts :s:d:u:fth params
do
case $params in

   s\) SOURCESCHEMA="$OPTARG" ;;

   f\) FULL='y' ;;

   t\) TABLE='y' ;;

   d\) DBNAME="$OPTARG" ;;

   u\) USERNAME="$OPTARG" ;;

   h\) 
       help_doc
       exit 0 
       ;;

   ?|:\) 
    echo "Invalid Option Specified"
    echo "$USAGE" 1>&2 ; exit 1 
   ;;

esac

done

Thanks..

You could do it a couple ways, one - by adding a checksum count to each case. At the end of the getsopts statement and before any other code is executed, check to see if the checksum value is what is expected. If you dont like this approach, take the easy way and evaluate $#. $# holds a count of the number of command line arguments passed to the script.

I added this line at the end of the script (after getopts), maybe the approach is wrong..

if [ $# -eq "3" ]; then
"Option 1 specified -s -d -u"
elif [ $# -eq "2" ]; then
"Option 2 specified -d and -f"
fi

However $# always evaluates to 6 if provide the option
scriptname -d databasename -u username -s schemaname. How did it arrive at 6 ?

I think I got it now.
If i provide scriptname -s schema -u user -d database, $# evaluates to 6 based on no of options and its values. (-s schema) 2, (-u user) 2 and (d database ) 2.

So if it is -d database -f it evaluates to 3 (-d database)2 and (-f) 1.
If he specifies -d database and -t ( That too evaluates to 3) .

How do i check if he has specified -t or -f then ?

I didnt test this at all, just a thought I had. Im sure there are a million ways to do this.

USAGE="Usage: `basename $0` [-s schemaname] [-d databasename] [-u username] -f -t -h"
while getopts :s:d:u:fth params
do
   case $params in
     s) SOURCESCHEMA="$OPTARG"
        let COUNT= $COUNT+10000
         ;;
     f) FULL='y'
         ;;

     t) TABLE='y'
         ;;

     d) DBNAME="$OPTARG"
         let COUNT= $COUNT+1
        ;;

     u) USERNAME="$OPTARG"
         let COUNT= $COUNT+1000
         ;;
     h) 
         help_doc
         exit 0 
         ;;
     ?) 
         echo "Invalid Option Specified"
         echo "$USAGE" 1>&2 ; exit 1 
         ;;
   esac

if [ "$COUNT" -ne 10101 ]
  then
    help_doc
    exit 0
elif [ ! -z $FULL ]
   then
      echo "Paramater FULL is Set"
elif [ ! -z $TABLE ]
   then
      echo "Paramater TABLE is Set"
else
    echo "Neither TABLE or FULL Are Set"
fi

I was able to do it with the $#. Thanks for the help..