hush: teach getopts to set/unset OPTARG
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
18
shell/ash_test/ash-getopts/getopt_optarg.right
Normal file
18
shell/ash_test/ash-getopts/getopt_optarg.right
Normal 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:''
|
16
shell/ash_test/ash-getopts/getopt_optarg.tests
Executable file
16
shell/ash_test/ash-getopts/getopt_optarg.tests
Executable 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'"
|
10
shell/hush.c
10
shell/hush.c
@@ -9874,11 +9874,6 @@ static int FAST_FUNC builtin_getopts(char **argv)
|
|||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
TODO:
|
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
|
If an invalid option is seen, getopts places ? into VAR and, if
|
||||||
not silent, prints an error message and unsets OPTARG. If
|
not silent, prints an error message and unsets OPTARG. If
|
||||||
getopts is silent, the option character found is placed in
|
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;
|
opterr = cp ? atoi(cp) : 1;
|
||||||
cp = get_local_var_value("OPTIND");
|
cp = get_local_var_value("OPTIND");
|
||||||
optind = cp ? atoi(cp) : 0;
|
optind = cp ? atoi(cp) : 0;
|
||||||
|
optarg = NULL;
|
||||||
|
|
||||||
/* getopts stops on first non-option. Add "+" to force that */
|
/* getopts stops on first non-option. Add "+" to force that */
|
||||||
/*if (optstring[0] != '+')*/ {
|
/*if (optstring[0] != '+')*/ {
|
||||||
@@ -9924,6 +9920,10 @@ Test that VAR is a valid variable name?
|
|||||||
exitcode = EXIT_FAILURE;
|
exitcode = EXIT_FAILURE;
|
||||||
c = '?';
|
c = '?';
|
||||||
}
|
}
|
||||||
|
if (optarg)
|
||||||
|
set_local_var_from_halves("OPTARG", optarg);
|
||||||
|
else
|
||||||
|
unset_local_var("OPTARG");
|
||||||
cbuf[0] = c;
|
cbuf[0] = c;
|
||||||
cbuf[1] = '\0';
|
cbuf[1] = '\0';
|
||||||
set_local_var_from_halves(var, cbuf);
|
set_local_var_from_halves(var, cbuf);
|
||||||
|
18
shell/hush_test/hush-getopts/getopt_optarg.right
Normal file
18
shell/hush_test/hush-getopts/getopt_optarg.right
Normal 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:''
|
16
shell/hush_test/hush-getopts/getopt_optarg.tests
Executable file
16
shell/hush_test/hush-getopts/getopt_optarg.tests
Executable 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'"
|
@@ -4,5 +4,4 @@ var=QWERTY
|
|||||||
while getopts "we" var; do
|
while getopts "we" var; do
|
||||||
echo "var:'$var' OPTIND:$OPTIND"
|
echo "var:'$var' OPTIND:$OPTIND"
|
||||||
done
|
done
|
||||||
# unfortunately, "rc:0" is shown since while's overall exitcode is "success"
|
|
||||||
echo "exited: var:'$var' OPTIND:$OPTIND"
|
echo "exited: var:'$var' OPTIND:$OPTIND"
|
||||||
|
Reference in New Issue
Block a user