How to Use getopts with longoptions?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting How to Use getopts with longoptions?
# 1  
Old 09-21-2014
Oracle How to Use getopts with longoptions?

Hi Guys,

I am using getopts utility to give user different options while executing the script. Here is my script.

Code:
set -- `getopt ero $*`
while [ $# -gt 0 ]
do
   case $1 in

        -e)    export exp_backup=true
                export sid=$3
				export env=$4
                echo "EXPORT BACKUP SET TO $exp_backup"
                echo "All Parameters: $*"
				shift 1;;

        -r)     export rman_backup=true
                export sid=$3
				export env=$4
                echo "RMAN BACKUP SET TO $rman_backup"
                echo "All Parameters: $*"
				shift 1;;

        -o)     export oid_config=true
                export sid=$3
				export env=$4
                echo "OID config is set to $oid_config"
                echo "All Parameters: $*"
				shift 1;;

        --) shift; break  ;;

   esac
done

Here is the output when i execute the code

Code:
[oracle@host ~]$ ksh test.ksh -e abc prod
EXPORT BACKUP SET TO true
All Parameters: -e -- abc prod
[oracle@host ~]$ ksh test.ksh -r abc prod
RMAN BACKUP SET TO true
All Parameters: -r -- abc prod
[oracle@host ~]$ ksh test.ksh -o abc prod
OID config is set to true
All Parameters: -o -- abc prod

Now i want replace these shortoptions with proper names by using longoptions

-e signifies export backup, so i want to replace -e with -exp
-r signifies rman backup, so i want to replace -r with -rman
-o signifies OID configuration,so I want to replace -o with -oid

We have --long in getopts but i never used, can you guys please help me out with this change.

Regards,
Veeresham
# 2  
Old 09-21-2014
Simply replace "-e" with "-exp" as they are all strings without any spaces in it...so the shell would pick it up as a single unit...
Code:
while [ $# -gt 0 ]
do
   case $1 in

        -exp)        export exp_backup=true
                     export sid=$3
		     export env=$4
                     echo "EXPORT BACKUP SET TO $exp_backup"
                     echo "All Parameters: $*"
		     shift 1;;

        -rman)       export rman_backup=true
                     export sid=$3
		     export env=$4
                     echo "RMAN BACKUP SET TO $rman_backup"
                     echo "All Parameters: $*"
		     shift 1;;

        -oid)        export oid_config=true
                     export sid=$3
		     export env=$4
                     echo "OID config is set to $oid_config"
                     echo "All Parameters: $*"
		     shift 1;;

        --)          shift; break  ;;

   esac
done

# 3  
Old 09-21-2014
Note: in your script instead of getopts you are using getopt, which is different and uses a different syntax...
# 4  
Old 09-21-2014
You might find this thread [BASH] Using getopts useful.

But getopts only supports 1 or 0 arguments for a flag. As a work around you can separate your two arguments with a colon something like:

Code:
ksh test.ksh -e abc:prod

or

Code:
ksh test.ksh --exp abc:prod

Code:
eval set -- $(getopt -l exp:,rman:,oid:,help -o e:r:o:h -- "$@")

while true
do
   name="$1"
   shift
   case $name in
       -e|--exp)  sid="${1%:*}"; env="${1#*:}"; shift; exp_backup=true ;;
       -r|--rman) sid="${1%:*}"; env="${1#*:}"; shift; rman_backup=true ;;
       -o|--oid)  sid="${1%:*}"; env="${1#*:}"; shift; oid_config=true ;;
       -h|--help) printf "$help_text" ; exit $RET_HELP ;;
       --) break ;;
       *)  echo "Illegal option: $name" ; exit 1 ;;
   esac
done
echo options left $#
echo "Debug: sid: $sid  env: $env"


Last edited by Chubler_XL; 09-21-2014 at 06:00 PM..
# 5  
Old 09-21-2014
Hi veeresh_15,
Your script is using getopt, not getopts. They are very different. And you want to use getopts. (The getopt utility is not built-in in the shells and can't correctly process quoted option-arguments in lots of cases. The use of getopt for option parsing was deprecated more than two decades ago.)

You should not replace short options with long options; you should add support for long options while keeping support for short options. (And note that long options should be introduced by two hyphens; not one. So, your code should accept -e, --exp, -o, --oid, -r, and --rman.) And, people using your script should not be required to enter -- to specify the end of options unless the sid operand starts with a hyphen.

Using getopts with long options is a non-standard extension that is provided in various ways by some shells on some operating systems (and is frequently either undocumented or poorly documented). What OS are you using?

You appear to be using ksh, but from what you have shown us, we can't tell if it is a 1988 Korn shell or a 1993 Korn shell. I think the following sample code will work with any 1993 version of ksh and I know it will also work on the 1988 version of ksh (and /usr/xpg4/bin/sh and /usr/xpg6/bin/sh) on some Solaris 10 systems.

Your code seems to only work if exactly one option is specified on the command line and three operands (or -- followed by two operands) are specified. The following sample code will work with one, two, or all three options and two operands (with or without -- before the operands). The -- argument is only required if the first operand's first character is a hyphen.

If you save the following in your file test.ksh:
Code:
#!/bin/ksh
IAm=${0##*/}
HelpFormat="Usage:\t$IAm -h
\t$IAm --help
\t$IAm -e [--oid] [--rman] [-or] sid env
\t$IAm --exp [--oid] [--rman] [-or] sid env
\t$IAm -o [--exp] [--rman] [-er] sid env
\t$IAm --oid [--exp] [--rman] [-er] sid env
\t$IAm -r [--exp] [--oid] [-eo] sid env
\t$IAm --rman [--exp] [--oid] [-eo] sid env
"
help() {
        printf "$HelpFormat"
}

# Process options:
eflg=0
oflg=0
rflg=0
while getopts "e(exp)h(help)o(oid)r(rman)" opt
do      case $opt in
        (e)     eflg=1
                export exp_backup=true
                echo "EXPORT BACKUP SET TO $exp_backup";;

        (h)     help
                exit 0;;

        (o)     oflg=1
                export oid_config=true
                echo "OID config is set to $oid_config";;

        (r)     rflg=1
                export rman_backup=true
                echo "RMAN BACKUP SET TO $rman_backup";;

        (?)     help >&2
                exit 1;;
        esac
done
shift $((OPTIND - 1))

# Verify that at least one option was given and that two operands are present...
if [ $# -ne 2 ]
then    printf '%s: exactly two operands are required.\n' "$IAm" >&2
        help >&2
        exit 2
fi
if [ $((eflg + oflg + rflg)) -eq 0 ]
then    printf '%s: at least one option is required.\n' "$IAm" >&2
        help >&2
        exit 3
fi

# Perform the requested actions...
sid=$1
env=$2
if [ $oflg -eq 1 ]
then    printf 'Configuring with sid="%s" and env="%s".\n' "$sid" "$env"
        # Do whatever is needed for the -o/--oid option.
fi
if [ $eflg -eq 1 ]
then    printf 'Processing export backup with sid="%s" and env="%s".\n' "$sid" "$env"
        # Do whatever is needed for the -e/--exp option.
fi
if [ $rflg -eq 1 ]
then    printf 'Processing rman backup with sid="%s" and env="%s".\n' "$sid" "$env"
        # Do whatever is needed for the -r/--rman option.
fi

and make it executable with:
Code:
chmod -x test.ksh

then any of the following commands:
Code:
test.ksh -ore -- "oid arg" "env arg"
test.ksh -o -r -e "oid arg" "env arg"
test.ksh --oid --rman --exp oid\ arg 'env arg'
test.ksh -or --exp oid' 'arg env" "arg

produce the output:
Code:
OID config is set to true
RMAN BACKUP SET TO true
EXPORT BACKUP SET TO true
Configuring with sid="oid arg" and env="env arg".
Processing export backup with sid="oid arg" and env="env arg".
Processing rman backup with sid="oid arg" and env="env arg".

This User Gave Thanks to Don Cragun For This Post:
# 6  
Old 09-22-2014
Thanks a lot Don Cragun for your detailed explanation and sample code!

I am using Red Hat Linux 6.3 & KSH version is of 1993.

Regards,
Veeresham

---------- Post updated at 02:20 PM ---------- Previous update was at 02:10 PM ----------

Sir, I have a question about
Code:
shift $((OPTIND - 1))

in your code.
Can you tell me what exactly this statement is doing?

Regards,
Veeresham
# 7  
Old 09-22-2014
Quote:
Originally Posted by veeresh_15
Thanks a lot Don Cragun for your detailed explanation and sample code!

... ... ...

Sir, I have a question about
Code:
shift $((OPTIND - 1))

in your code.
Can you tell me what exactly this statement is doing?

Regards,
Veeresham
The variable OPTIND is set by getopts to indicate the next command line argument to be processed. (After the options and, if present, -- have been processed.) The command:
Code:
shift $((OPTIND - 1))

then shifts off everything except the operands that remain after the options have been processed.
This User Gave Thanks to Don Cragun For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Using getopts

Hi. Can somebody please show me an example of how to use getopts to assign a variable if it's been passed into the script but to set a default if no value has been passed in? And also how to handle a param with multiple values ... so a sub parse (can I use a function for this?)? Here's my code... (1 Reply)
Discussion started by: user052009
1 Replies

2. Shell Programming and Scripting

Getopts help

Hi All, I am writing a script to pass the getopts argument to the function which I have. But it as soon as I execute the script, the argument is taking it as blank. I tried using multiple way to check but its not working. Can someone please let me know what wrong in this code. function1()... (4 Replies)
Discussion started by: sidh_arth85
4 Replies

3. UNIX for Dummies Questions & Answers

Getopts

while getopts v OPTION do case $OPTION in v) echo "Hello" ;; *) exit 1;; esac done Suppose I have script tmp.sh Whose Signature is tmp.sh <fixed_argument> When I run the script with tmp.sh -v "file", it echoes a hello but, when I try the other way i.e, tmp.sh... (1 Reply)
Discussion started by: Devendra Hupri
1 Replies

4. Shell Programming and Scripting

Using getopts. Need help

Hi all... I have been looking on here for the past few days for an answer and Im gonna have to break down and ask. I just learned about the getopts command last week so have been trying to utilize it in my scripts. Below, I am trying to set up a case structure for options using getopts.... (1 Reply)
Discussion started by: losingit
1 Replies

5. Shell Programming and Scripting

getopts help

First off, I apologize for my lack of knowledge. I realize my problem will probably seem pretty basic to everyone, but I've been at this for several hours now and I've gotten nowhere. I would contact my professor, but it is too late for that. Anyway, I'm trying to write a function called... (1 Reply)
Discussion started by: Unknown50862
1 Replies

6. UNIX for Dummies Questions & Answers

Getopts

Hey, i need help with the use of getopts in shell script. tried reading a lot online, but found incomplete examples (maybe complete but cudn't make out). PLzz help...explain in deatil plzzz, i am a newbie:confused: (3 Replies)
Discussion started by: SasankaBITS
3 Replies

7. Shell Programming and Scripting

using getopts

Hi, I have a program where I want to use getopts. I want to use "-i" option and then optionally supply arguments. If user dosent supply arguments, then also it should work. Please tell me how to proceed. Here is some code, this is not right code btw but a sample to understand what I want to... (1 Reply)
Discussion started by: som.nitk
1 Replies

8. Shell Programming and Scripting

Using getopts

I am having some trouble/questions with getopts that I can't find any solid info on with google I need it to parse things of the syntax of: -r # # # -f -c with as many repeats as possible, and it should catch erroneous commands also, but continue going... my first question is, -r... (3 Replies)
Discussion started by: TurboArkhan
3 Replies

9. HP-UX

using getopts

Is there a restriction on levels of using 'getopts' ? I have several scripts, each of which requires an option as the first parameter . If I call one prg separately it works fine, but when one prg calls another prg and passes the option on the called prg, then the called prg seems not to process... (3 Replies)
Discussion started by: vslewis
3 Replies

10. Shell Programming and Scripting

getopts

I have a script that facillitates NDM (Connect::\Direct) transfer to remote hosts. This script uses getopts to parse through the parameters passed to it and to set appropriate variables based upon what was passed in. Kickoff="mv $PATH/$FILE1 $PATH/$FILE2" ndm_shell.ksh -p $Node -s $Source -d... (3 Replies)
Discussion started by: google
3 Replies
Login or Register to Ask a Question