使用带有长名称的单破折号

使用带有长名称的单破折号

我知道当我们使用 getopt 或 optparse 设置选项时,一个破折号会与一个字符对应。但无论如何,是否可以使用带有多个字符的单破折号,例如-apply

我知道一个破折号是指一个短名称,并且通常人们使用一个字符来表示它。但有一些命令(例如,find -printf)使用带有单个破折号的长名称。

有谁知道如何在 Linux 上的 bash 中使用长名称和一个破折号(使用getoptoptparse其他 bash 工具)?

答案1

getopt的联机帮助页:

-a, --alternative
        Allow long options to start with a single '-'.

或者,如果我们谈论的是getopt*C函数:

getopt_long_only() is like getopt_long(), but '-' as well as "--" can indicate a long option

答案2

如果您有 GNU 系统,并且需要单破折号长选项,那么请务必使用getopt_longgetopt -a

这个例子find -printf让我注意到 GNU 扩展:find在 GNU 系统之外也存在一划线选项,而且其传承可能比 GNU 风格的长选项要古老得多。因此,像这样的程序find可能不使用getopt_long,而只是手动解析它们的命令行选项。在 bash 中,它可能看起来像这样:

$ cat args.sh
#!/bin/sh
foo=0
bar=0
while [ "$#" -ne 0 ] ; do 
        if [ "$1" = "-foo" ] ; then
                foo=1
        elif [ "$1" = "-bar" ] ; then
                shift
                bar=$1
        fi
        shift
done
echo foo: "$foo"
echo bar: "$bar"
$ ./args.sh -bar x -foo
foo: 1
bar: x

答案3

解析单字符选项的困难在于它们可以被捆绑(例如-ab相当于-a -b)。 GNU 风格的长选项有一个困难,即参数可以连接也可以不连接。使用单破折号多字符选项,不存在任何解析困难,因此您可以轻松地手动完成。

大多数具有单破折号多字符选项的程序都在单独的命令行参数中接受参数。

foo=
bar=default
require_argument () {
  if [ $# -eq 2 ]; then
    echo >&2 "$0: Option $1 requires an argument"
    exit 2
  fi
  eval "$1=\"\$3\""
}
while case "$1" in
        --) shift; false;;
        -foo) foo=1 
        -bar) require_argument bar "$@"; shift;;
        -?*) echo >&2 "$0: Unknown option $1"; exit 2;;
        *) false;;
      esac
do
  shift
done

请考虑使用 GNU 风格的长选项。他们的行为更加规范,也被更多的人所熟悉。

相关内容