POSIX 多值 option_argument 语法

POSIX multi-value option_argument syntax

我已阅读https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html

我知道短 option_argument 可以看起来像 -kvalue-k value

如果我们想为 option_argument 指定多个值,我们可以编写 -kvalue1 -kvalue2-k value1 -k value2 或两种语法的混合。

我的问题:

-k value1 value2是否有效并等同于上面的内容?

此外,长时间 option_arguments 呢? --key value1 value2一样吗?

-k value1 value2 通常等同于 -k value1 -- value2,其中 value1option_argument-kvalue2 是一个 操作数 (一个程序参数,如 echo value2ls value2)。如果你通过操纵 optind/OPTIND 来实现它,你会遇到以下问题:

  • -k value1 value2 ... valueN input-file 中,您怎么知道 input-file 是输入文件而不是 -k input-file
  • -k -z 是否意味着 -k 有 0 个参数,后跟 -z 选项,或者 -z 被视为 option_argument? -k value1 value2 -z value4 呢?

此外,-k value1 -k value2 通常会将 value1 替换为 value2,因此最好记录下 -k 的附加行为(如果已实施)。您应该避免使用 -(-) 选项。在 Solaris 上,根据其 CLIP guidelines(向下滚动到 命令语法标准:指南 部分),() 字符分隔长选项名称,就像 ?(help)V(version) 会将 --help 识别为 -?,将 --version 识别为 -V

至于长选项参数,POSIX 不支持它们,无论是 -old-style arg--gnu-style=arg 还是 --gnu-style arg。根据 POSIX,optstring "-:k:" 不可移植,因为 - 不是字母数字;即使支持,您也需要处理在 --key value1 的情况下更改 optind/OPTIND 以将键值设置为 value1 因为 keyoption_argument 用于 - 选项。

如果您只是编写一个实用程序而不是在您自己的选项解析器中实施 getopt 规则,另一种方法是依赖 getopt_long,牢记 implementation differences;它被广泛使用,即使它没有被 POSIX 指定。您还可以使用单独的选项解析库(或 shell 函数或任何您将在您正在处理的语言中使用的函数)。