bash getopts 忽略选项,除非它们以某种方式指定
bash getopts ignores options unless they are specified in a certain way
Bash getopts 应该允许选项和参数不依赖于位置,如 tutorials and docs 中所述。
以下代码片段可以接收两个选项:
- 一个调试 -d 选项需要一个参数
- 强制 -f 选项,不带参数。
我发现只有列出的第一个选项得到正确处理的奇怪行为。
#!/bin/bash
## Defaults
DEBUG=INFO
forceOption=FALSE
## Usage
printUsage() {
echo " "
echo "USAGE: [=11=] [-d <DEBUG_LEVEL>] [ -f ]"
echo " "
exit 1
}
#
## Manage options before start
#
while getopts "hfd:" OPT
do
case $OPT in
h) printUsage ;;
f) forceOption="TRUE" ;;
d) debugLevel="$OPTARG" ;;
*) printUsage ;;
esac
shift `expr $OPTIND - 1`
done
if [ -n "$debugLevel" ] ; then
DEBUG="$debugLevel"
fi
echo "DEBUG : $DEBUG"
echo "Force : $forceOption"
您可以在下面看到错误行为:
[rgulia$ ~] ./getopts.sh -d WARNING -f
DEBUG : WARNING
Force : FALSE
[rgulia$ ~] ./getopts.sh -f -d WARNING
DEBUG : INFO
Force : TRUE
如果选项单独使用,或者如果 -f 在选项列表中位于 -d 之前并且它们是彼此依附
[rgulia$ ~] ./getopts.sh -f
DEBUG : INFO
Force : TRUE
[rgulia$ ~] ./getopts.sh -d WARNING
DEBUG : WARNING
Force : FALSE
[rgulia$ ~] ./getopts.sh -fd WARNING
DEBUG : WARNING
Force : TRUE
我的印象是循环退出得太早,因为当向选项传递参数时它无法正确计算 OPTIND。
我用 printf 语句对 OPT、OPTARG 和 OPTIND 的值进行了一些跟踪,证实了这种理论,但我仍然不明白为什么会发生这种情况以及如何解决它。
有什么建议吗?
将轮班排除在循环之外。 OPTIND 是原始 arg 向量的绝对索引。在循环
之后做一次移位
Bash getopts 应该允许选项和参数不依赖于位置,如 tutorials and docs 中所述。
以下代码片段可以接收两个选项:
- 一个调试 -d 选项需要一个参数
- 强制 -f 选项,不带参数。
我发现只有列出的第一个选项得到正确处理的奇怪行为。
#!/bin/bash
## Defaults
DEBUG=INFO
forceOption=FALSE
## Usage
printUsage() {
echo " "
echo "USAGE: [=11=] [-d <DEBUG_LEVEL>] [ -f ]"
echo " "
exit 1
}
#
## Manage options before start
#
while getopts "hfd:" OPT
do
case $OPT in
h) printUsage ;;
f) forceOption="TRUE" ;;
d) debugLevel="$OPTARG" ;;
*) printUsage ;;
esac
shift `expr $OPTIND - 1`
done
if [ -n "$debugLevel" ] ; then
DEBUG="$debugLevel"
fi
echo "DEBUG : $DEBUG"
echo "Force : $forceOption"
您可以在下面看到错误行为:
[rgulia$ ~] ./getopts.sh -d WARNING -f
DEBUG : WARNING
Force : FALSE
[rgulia$ ~] ./getopts.sh -f -d WARNING
DEBUG : INFO
Force : TRUE
如果选项单独使用,或者如果 -f 在选项列表中位于 -d 之前并且它们是彼此依附
[rgulia$ ~] ./getopts.sh -f
DEBUG : INFO
Force : TRUE
[rgulia$ ~] ./getopts.sh -d WARNING
DEBUG : WARNING
Force : FALSE
[rgulia$ ~] ./getopts.sh -fd WARNING
DEBUG : WARNING
Force : TRUE
我的印象是循环退出得太早,因为当向选项传递参数时它无法正确计算 OPTIND。
我用 printf 语句对 OPT、OPTARG 和 OPTIND 的值进行了一些跟踪,证实了这种理论,但我仍然不明白为什么会发生这种情况以及如何解决它。
有什么建议吗?
将轮班排除在循环之外。 OPTIND 是原始 arg 向量的绝对索引。在循环
之后做一次移位