我在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"
如果我多次运行该命令,该参数将被忽略。我必须运行diff。标志,以便识别它。
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
是可重复的。
发布于 2018-02-28 17:39:30
由于您在同一shell实例中重复调用shell函数,因此不会在两次调用deployMenu
之间重置$OPTIND
的值。这会影响getopts
在每次调用时将哪个选项视为“下一步”。尝试使用deployMenu ...; echo $OPTIND
进行相同的实验。如果您计划多次调用deployMenu
,那么解决方案可能就是显式地设置OPTIND=1
。
deployMenu() {
noInstallDependencies='false'
build='true'
echo "Args: $@"
OPTIND=1
while getopts 'db' flag; do
...
}
https://stackoverflow.com/questions/49035174
复制相似问题