问题
I'm trying to create a simple function on macOS Sierra that counts the characters in a string. This works fine (added to my bashrc file):
function cchar() {
str=$1
len=${#str}
echo "string is $len char long"
}
$ cchar "foo"
string is 3 char long
I'm trying to expand it with a -a option, so I added this to my function (and commented the rest out for testing):
while getopts "a:" opt; do
case $opt in
a)
echo "-a param: $OPTARG" >&2
;;
esac
done
After some testing while writing this, I've noticed everytime I run cchar -a "test", I have to run it without options (cchar) otherwise the next time I run it with the -a option, it doesn't recognise the option.
$ cchar
$ cchar -a "foo"
-a param: foo
$ cchar -a "foo"
$ cchar
$ cchar -a "foo"
-a param: foo
回答1:
You have to reset the variable OPTIND, which keeps track of the current positional argument number. It should suffice to make that variable local to your function.
回答2:
The final code I ended up using:
# Count characters in a string
function cchar() {
local OPTIND
while getopts "a:" opt; do
case $opt in
a)
echo ${#OPTARG}
return
;;
esac
done
echo "string is ${#1} characters long"
}
$ cchar "foo bar"
string is 7 characters long
$ cchar -a "foo bar"
7
Note: I had to use return in lieu of exit, when sourced from .bashrc, exit will close the current shell.
来源:https://stackoverflow.com/questions/42336595/in-bash-why-does-using-getopts-in-a-function-only-work-once