hush: teach getopts to set/unset OPTARG

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2017-08-11 02:05:21 +02:00
parent 74d4058928
commit 81f962f3df
6 changed files with 73 additions and 6 deletions

View File

@ -0,0 +1,18 @@
*** no OPTIND, optstring:'w:et' args:-q -w e -r -t -y
Illegal option -q
var:'?' OPTIND:2 OPTARG:''
var:'w' OPTIND:4 OPTARG:'e'
Illegal option -r
var:'?' OPTIND:5 OPTARG:''
var:'t' OPTIND:6 OPTARG:''
Illegal option -y
var:'?' OPTIND:7 OPTARG:''
exited: var:'?' OPTIND:7 OPTARG:''
*** OPTIND=0, optstring:'w:et' args:-w 1 -w2 -w -e -e -t -t
var:'w' OPTIND:3 OPTARG:'1'
var:'w' OPTIND:4 OPTARG:'2'
var:'w' OPTIND:6 OPTARG:'-e'
var:'e' OPTIND:7 OPTARG:''
var:'t' OPTIND:8 OPTARG:''
var:'t' OPTIND:9 OPTARG:''
exited: var:'?' OPTIND:9 OPTARG:''

View File

@ -0,0 +1,16 @@
set -- -q -w e -r -t -y
echo "*** no OPTIND, optstring:'w:et' args:$*"
var=QWERTY
OPTARG=ASDFGH
while getopts "w:et" var; do
echo "var:'$var' OPTIND:$OPTIND OPTARG:'$OPTARG'"
done
echo "exited: var:'$var' OPTIND:$OPTIND OPTARG:'$OPTARG'"
set -- -w 1 -w2 -w -e -e -t -t
echo "*** OPTIND=0, optstring:'w:et' args:$*"
OPTIND=0
while getopts "w:et" var; do
echo "var:'$var' OPTIND:$OPTIND OPTARG:'$OPTARG'"
done
echo "exited: var:'$var' OPTIND:$OPTIND OPTARG:'$OPTARG'"

View File

@ -9874,11 +9874,6 @@ static int FAST_FUNC builtin_getopts(char **argv)
{
/*
TODO:
if a character is followed by a colon, the option is expected to have
an argument, which should be separated from it by white space.
When an option requires an argument, getopts places that argument into
the variable OPTARG.
If an invalid option is seen, getopts places ? into VAR and, if
not silent, prints an error message and unsets OPTARG. If
getopts is silent, the option character found is placed in
@ -9906,6 +9901,7 @@ Test that VAR is a valid variable name?
opterr = cp ? atoi(cp) : 1;
cp = get_local_var_value("OPTIND");
optind = cp ? atoi(cp) : 0;
optarg = NULL;
/* getopts stops on first non-option. Add "+" to force that */
/*if (optstring[0] != '+')*/ {
@ -9924,6 +9920,10 @@ Test that VAR is a valid variable name?
exitcode = EXIT_FAILURE;
c = '?';
}
if (optarg)
set_local_var_from_halves("OPTARG", optarg);
else
unset_local_var("OPTARG");
cbuf[0] = c;
cbuf[1] = '\0';
set_local_var_from_halves(var, cbuf);

View File

@ -0,0 +1,18 @@
*** no OPTIND, optstring:'w:et' args:-q -w e -r -t -y
./getopt_optarg.tests: invalid option -- q
var:'?' OPTIND:2 OPTARG:''
var:'w' OPTIND:4 OPTARG:'e'
./getopt_optarg.tests: invalid option -- r
var:'?' OPTIND:5 OPTARG:''
var:'t' OPTIND:6 OPTARG:''
./getopt_optarg.tests: invalid option -- y
var:'?' OPTIND:7 OPTARG:''
exited: var:'?' OPTIND:7 OPTARG:''
*** OPTIND=0, optstring:'w:et' args:-w 1 -w2 -w -e -e -t -t
var:'w' OPTIND:3 OPTARG:'1'
var:'w' OPTIND:4 OPTARG:'2'
var:'w' OPTIND:6 OPTARG:'-e'
var:'e' OPTIND:7 OPTARG:''
var:'t' OPTIND:8 OPTARG:''
var:'t' OPTIND:9 OPTARG:''
exited: var:'?' OPTIND:9 OPTARG:''

View File

@ -0,0 +1,16 @@
set -- -q -w e -r -t -y
echo "*** no OPTIND, optstring:'w:et' args:$*"
var=QWERTY
OPTARG=ASDFGH
while getopts "w:et" var; do
echo "var:'$var' OPTIND:$OPTIND OPTARG:'$OPTARG'"
done
echo "exited: var:'$var' OPTIND:$OPTIND OPTARG:'$OPTARG'"
set -- -w 1 -w2 -w -e -e -t -t
echo "*** OPTIND=0, optstring:'w:et' args:$*"
OPTIND=0
while getopts "w:et" var; do
echo "var:'$var' OPTIND:$OPTIND OPTARG:'$OPTARG'"
done
echo "exited: var:'$var' OPTIND:$OPTIND OPTARG:'$OPTARG'"

View File

@ -4,5 +4,4 @@ var=QWERTY
while getopts "we" var; do
echo "var:'$var' OPTIND:$OPTIND"
done
# unfortunately, "rc:0" is shown since while's overall exitcode is "success"
echo "exited: var:'$var' OPTIND:$OPTIND"