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.
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
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:
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:
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)