bash getopts 会忽略选项,除非以某种方式指定它们



Bash getopts应该允许选项和参数不依赖于位置,如教程和文档中所述。

以下代码片段可能会收到两个选项:

  • 需要参数的调试-d选项
  • 一个不带参数的强制-f选项。

我看到只有列出的第一个选项才能正确处理的奇怪行为。

#!/bin/bash
## Defaults 
DEBUG=INFO
forceOption=FALSE
## Usage
printUsage() {
echo "  "    
echo "USAGE: $0 [-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 向量的绝对索引。循环后进行一次班次

相关内容

最新更新