I’ve got a bash function that I’m trying to use getopts with and am having some trouble.
The function is designed to be called by itself (getch), with an optional -s flag (getch -s), or with an optional string argument afterward (so getch master and getch -s master are both valid).
The snippet below is where my problem lies – it isn’t the entire function, but it’s what I’m focusing on:
getch()
{
if [ "$#" -gt 2 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
echo "Usage: $0 [-s] [branch-name]" >&2
return 1
fi
while getopts "s" opt; do
echo $opt # This line is here to test how many times we go through the loop
case $opt in
s)
squash=true
shift
;;
*)
;;
esac
done
}
The getch -s master case is where the strangeness happens. The above should spit out s once, but instead, I get this:
[user@host:git-repositories/temp]$ getch -s master
s
s
[user@host:git-repositories/temp]$
Why is it parsing the -s opt twice?
I can’t reproduce the problem either, on an Ubuntu 10.4 box running Bash 4, or my MacOSX box running Bash 3.2.17.
Your shell environment might be tainted by earlier debugging efforts.
Have you tried to start with a new terminal window? Or start a new shell with ‘exec bash’ and try the function again.