在 bash 脚本中实现顺序独立选项的规范方法是什么?

在 bash 脚本中实现顺序独立选项的规范方法是什么?

可能的重复:
如何处理 shell 脚本中的开关?

最常见的 shell 命令允许用户以任意随机顺序指定选项。$1另一方面,像 bash 中常用的位置参数(我倾向于在 Bash 中编写所有脚本,但我不认为这个问题实际上是 Bash 特定的)脚本是特定于顺序的。

现在我可以想出一些一种无需 bash 脚本用户在提供可选参数时遵守任何特定顺序的方法。 (我想到了使用正则表达式或全局变量来测试扩展中是否存在某些特定选项$@。)但是,我真的想找出是否有一种特别规范的方法来实现此类选项。考虑到选项的通用语法(例如-r许多 shell 命令),我当然认为应该有。

答案1

getoptgetopts支持给定参数的任何顺序 - 它们易于使用,并且似乎是参数解析的规范解决方案。

经常提到的两个区别:

  • getopt支持长选项,例如--help.
  • getopts是一个内置的 Bash shell,而不是一个独立的程序。

简化 广泛例子:

# Process parameters
params="$(getopt -o e:hv \
    -l exclude:,help,verbose \
    --name "$0" -- "$@")"

if [ $? -ne 0 ]
then
    usage
fi

eval set -- "$params"
unset params

while true
do
    case $1 in
        -e|--exclude)
            excludes+=("${2-}")
            shift 2
            ;;
        -h|--help)
            usage
            exit
            ;;
        -v|--verbose)
            verbose='--verbose'
            shift
            ;;
        --)
            shift
            if [ -z "${1:-}" ]
            then
                error "Missing targets." "$help_info" $EX_USAGE
            fi
            if [ -z "${2:-}" ]
            then
                error "Missing directory." "$help_info" $EX_USAGE
            fi
            targets=(${@:1:$(($#-1))})
            source_dir="${@:$#}"
            break
            ;;
        *)
            usage
            ;;
    esac
done

相关内容