我在bash_profile中写了一个小的bash脚本。我想使用getopts
来解析选项。
deployMenu() {
noInstallDependencies='false'
build='true'
echo "Args: $@"
while getopts 'db' flag; do
echo "flag ${flag}"
case "${flag}" in
d) noInstallDependencies='true' ;;
b) build='false' ;;
#*) echo "Unexpected option ${flag}" ;;
#\?) echo "Unexpected option ${flag}" ;;
esac
done
echo "noInstallDependencies $noInstallDependencies"
echo "build $build"
如果我多次运行该命令,则忽略该参数。我必须运行差异。标志,以使其得到认可。
User:project User$ deployMenu -b
Args: -b
noInstallDependencies false
build true
User:project User$ deployMenu -b
Args: -b
noInstallDependencies false
build true
User:project User$ deployMenu --b -b
Args: --b -b
flag b
noInstallDependencies false
build false
User:project User$ deployMenu --b -b
Args: --b -b
noInstallDependencies false
build true
正如您所看到的,只有在将-b
到--<something> -b
的参数更改后才会识别该标记。我首先想到的是第一个参数被忽略但是运行两次--b -b
也失败了。是否有任何缓存或任何要重置的东西?首先使用-b
然后切换到--b -b
是可以重现的。
答案 0 :(得分:1)
由于您在同一个shell实例中重复调用shell函数,因此在调用$OPTIND
之间不会重置deployMenu
的值。这会影响每次调用getopts
哪个选项为“下一个”。尝试使用deployMenu ...; echo $OPTIND
进行相同的实验。如果您计划多次调用OPTIND=1
,解决方案可能只是明确设置deployMenu
。
deployMenu() {
noInstallDependencies='false'
build='true'
echo "Args: $@"
OPTIND=1
while getopts 'db' flag; do
...
}