i have the following scenario want to run the following script with manadory and optional arguments inside a bash script

Manadory options are :

filename=""
port=""
optional arguments

type -t [A/B]
balances -b bal
prices -p

./test filename port -t A -b bal

my code i have that won't parse the options is
This is what i have

!/bin/bash

filename=""
port=""

while getopts b:t:p opt
 do
      case $opt in
          b) BAL="${OPTARG}"
             if [ "$BAL" == "" ]
             then
                print_usage $0
             else
                echo "Balances is " $BAL
             fi ;;

          t) TYPE="$OPTARG";;
          p) PRICES="$OPTARG";;
          ?) print_usage $0
             exit 1;;
      esac
done
echo "Balances:                "$BAL
echo "Type:                    "$TYPE

Any ideas

Edited 3 Years Ago by Reverend Jim: Fixed formatting

Please use the (CODE) button
Please tell us specifically what "won't parse the options" means. Do you get options that are incorrect? Does the script run, but no options are seen? What?

Edited 3 Years Ago by mike_2000_17: Fixed formatting

Please use the (CODE) button
Please tell us specifically what "won't parse the options" means. Do you get options that are incorrect? Does the script run, but no options are seen? What?

Ok sorry I want to be able to pass in the manadory options and then the optional

the Manadory options are been parsed but -t -p -b aren't been parsed just ignored .

this is what i want
test filename port -t -p 123 -b we
so far filename and port but -t -p -b are not been parsed

Any ideas ?!?
have but the

while getopts t:p:b: opt ; do
...

done
filename="$1"
port="$2"

shift $(( OPTIND-2 ))

Edited 3 Years Ago by mike_2000_17: Fixed formatting

My version of getopts wants only flagged options, so try this:

filename=$1
port=$2
shift 2
while getopts t:p:b: opt ; do
 # ...
done

Of course that doesn't have any error checking etc

the above exmaple gets the mandatory options missed up with the optional arguments .

filename=$1
  
      port=$2
 
      ext= $3

      shift 3
   
      while getopts t:p:b: opt ; do
   
  case $opt in
               t) tfile="${OPTARG}";;
               p) tdir="${OPTARG}";;
               b) tbl="${OPTARG}";;
               ?) print_usage $0
            exit 1;;
   esac

   
      done
echo "file = $file"
echo " Port =$port "
echo " Ext= $ext
echo  "opt1 = $tfile "
echo " opt2 = $tdir"
echo " opt3 = $tbal"

if i run this script with wrong numbe of mandatory arguments and use optional argumnets it will assign the optional to the mandatory argumnets .
./bscript file1 -t BLAH

result
file = file1
port = -t
ext = BLAH

how can i avoid this from happening ??

This article has been dead for over six months. Start a new discussion instead.