我在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
是可重现的。
由于您在同一个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
...
}