[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
getopts
From: |
Sid Elmer |
Subject: |
getopts |
Date: |
Wed, 22 Jan 2003 13:15:12 -0800 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.8) Gecko/20020204 |
From: sid
To: bug-bash@gnu.org
Subject: [50 character or so descriptive subject here (for reference)]
Configuration Information [Automatically generated, do not change]:
Machine: i386
OS: linux
Compiler: gcc -I/usr/src/packages/BUILD/bash-2.05
Compilation CFLAGS: -DPROGRAM='bash' -DCONF_HOSTTYPE='i386'
-DCONF_OSTYPE='linux' -DCONF_MACHTYPE='i386-suse-linux'
-DCONF_VENDOR='suse' -DSHELL -DHAVE_CONFIG_H -D_FILE_OFFSET_BITS=64
-I. -I/usr/include -I. -I./include -I./lib -I/usr/include -O2
-march=i486 -mcpu=i686 -D_GNU_SOURCE -Wall -pipe
uname output: Linux DN800c9806 2.4.18-4GB #2 Wed Jul 31 14:57:36 PDT
2002 i686 unknown
Machine Type: i386-suse-linux
Bash Version: 2.05
Patch Level: 0
Release Status: release
Description:
[Detailed description of the problem, suggestion, or complaint.]
I am trying to write a shell function in bash. I want the function to
be as useful as possible so I use "getopts" to process options to the
function. Below in the Repeat-By Section, I have included a sample
script with an example of a function I tried to write. And I also
included the output when I run the script so hopefully it is clear what
is going wrong.
I wrote a function, counting, which takes options to set the beginning
number, ending number, and stride, then prints out the sequence of
numbers. The script calls this function multiple times. The first time
it is called with no options, so the default number sequence is printed
out. Then the script enters a loop where the "counting" function is
called three more times. The first time it is called, the function
works perfectly. However, subsequent calls to the "counting" function
fail to give the expected results. It appears that the option list is
not processed by getopts, but rather, the default sequence is printed.
Finally, and most perplexing of all, the script makes one last call to
the "counting" function, after the for loop. The output of this call
shows that the option for the stride variable is processed, but the
other two options are ignored. Is this a bug with getopts?? Or am I
forgetting a call to reinitialize getopts somewhere?? I've looked
through the bash users' guide and found a reference that says OPTIND
needs to be manually reset in order for getopts to work properly. I've
tried to manually reset OPTIND by placing the following line directly
after each call to the "counting" function:
let OPTIND=1
but I get the same output. Did I not reset OPTIND properly? If not,
could someone give me an example of how to properly reset OPTIND? Or,
if I've completely missed the boat, could someone please instruct me
what I need to do to get the function working properly? Thank you very
much.
Sid Elmer
sidnasty@stanford.edu
Repeat-By:
[Describe the sequence of events that causes the problem
to occur.]
----------------------------
-------- script ----------
----------------------------
bash> cat tmp.sh
#!/bin/bash
function counting ()
{
#set defaults
local -i begin=1
local -i end=10
local -i skip=1
echo "before getopts: OPTIND = $OPTIND"
while getopts ':b:e:s:' opt; do
case $opt in
b) begin=$OPTARG
echo "middle: OPTIND = $OPTIND";;
e) end=$OPTARG
echo "middle: OPTIND = $OPTIND";;
s) skip=$OPTARG
echo "middle: OPTIND = $OPTIND";;
\?) echo "ERROR: $OPTARG is not a valid option"
exit 1;;
esac
done
shift $(( $OPTIND-1 ))
echo "after getopts: OPTIND = $OPTIND"
for ((j=$begin;j<=$end;j+=$skip)); do
echo "$j"
done
}
echo "defaults"
counting
echo
echo
echo "loop"
for ((i=10;i<13;i++)); do
echo "i=$i"
counting -b $i -e $(( $i+5 ))
echo
done
echo
counting -b 50 -e 75 -s 5
-------------------------------
------ output ---------------
-------------------------------
bash> ./tmp.sh
defaults
before getopts: OPTIND = 1
after getopts: OPTIND = 1
1
2
3
4
5
6
7
8
9
10
loop
i=10
before getopts: OPTIND = 1
middle: OPTIND = 3
middle: OPTIND = 5
after getopts: OPTIND = 5
10
11
12
13
14
15
i=11
before getopts: OPTIND = 5
after getopts: OPTIND = 5
1
2
3
4
5
6
7
8
9
10
i=12
before getopts: OPTIND = 5
after getopts: OPTIND = 5
1
2
3
4
5
6
7
8
9
10
before getopts: OPTIND = 5
middle: OPTIND = 7
after getopts: OPTIND = 7
1
6
Fix:
[Description of how to fix the problem. If you don't know a
fix for the problem, don't include this section.]
[Prev in Thread] |
Current Thread |
[Next in Thread] |