Mac OS: Bash GetOpts 有时被忽略
Mac OS: Bash GetOpts Sometimes Ignored
我在 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
后才能识别标志。我首先认为第一个参数被忽略了,但是 运行ning 两次 --b -b
也失败了。是否有任何缓存或任何东西要先重置?首先使用 -b
然后切换到 --b -b
使其工作是可重现的。
由于您在同一 shell 实例中重复调用 shell 函数,因此 $OPTIND
的值不会在调用 deployMenu
之间重置。这会影响 getopts
每次被调用时哪个选项被视为 "next"。使用 deployMenu ...; echo $OPTIND
尝试相同的实验。如果您计划多次调用 deployMenu
,解决方案可能只是显式设置 OPTIND=1
。
deployMenu() {
noInstallDependencies='false'
build='true'
echo "Args: $@"
OPTIND=1
while getopts 'db' flag; do
...
}
我在 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
后才能识别标志。我首先认为第一个参数被忽略了,但是 运行ning 两次 --b -b
也失败了。是否有任何缓存或任何东西要先重置?首先使用 -b
然后切换到 --b -b
使其工作是可重现的。
由于您在同一 shell 实例中重复调用 shell 函数,因此 $OPTIND
的值不会在调用 deployMenu
之间重置。这会影响 getopts
每次被调用时哪个选项被视为 "next"。使用 deployMenu ...; echo $OPTIND
尝试相同的实验。如果您计划多次调用 deployMenu
,解决方案可能只是显式设置 OPTIND=1
。
deployMenu() {
noInstallDependencies='false'
build='true'
echo "Args: $@"
OPTIND=1
while getopts 'db' flag; do
...
}