gpt4 book ai didi

shell - 在 shell 脚本中使用的可移植 getopt_long 等效项

转载 作者:行者123 更新时间:2023-12-04 09:45:55 24 4
gpt4 key购买 nike

我想解析 shell 脚本中的长选项。 POSIX 仅提供 getopts解析单个字母选项。有谁知道在 shell 中实现长选项解析的可移植 (POSIX) 方法?我看过什么autoconf生成 configure 时执行脚本,但结果远非优雅。我可以接受只接受长选项的完整拼写。仍应允许单字母选项,可能是成组的。

我正在考虑一个 shell 函数,它采用空格分隔的形式选项 [=flags] 的 args 列表,其中标志表明该选项采用 arg 或可以多次指定。与 C 语言不同,不需要区分字符串、整数和浮点数。

最佳答案

可移植 shell 的设计说明 getopt_long命令

我有一个程序 getoptx它适用于单字母选项(因此它不是您问题的答案),但它可以正确处理带有空格的参数,原始 getopt命令(与 shell 内置 getopts 相反)没有。源代码中的规范说:

/*
** Usage: eval set -- $(getoptx abc: "$@")
** eval set -- $(getoptx abc: -a -c 'a b c' -b abc 'd e f')
** The positional parameters are:
** $1 = "-a"
** $2 = "-c"
** $3 = "a b c"
** $4 = "-b"
** $5 = "--"
** $6 = "abc"
** $7 = "d e f"
**
** The advantage of this over the standard getopt program is that it handles
** spaces and other metacharacters (including single quotes) in the option
** values and other arguments. The standard code does not! The downside is
** the non-standard invocation syntax compared with:
**
** set -- $(getopt abc: "$@")
*/

我推荐 eval set -- $(getopt_long "$optspec" "$@")您的符号 getopt_long .
getopt_long 的一个主要问题是参数规范的复杂性—— $optspec在示例中。

您可能想查看 Solaris CLIP 中使用的符号。 (命令行界面范式)用于表示法;它使用单个字符串(如原始 getopt() 函数)来描述选项。 (谷歌:“solaris clip 命令行界面范式”;仅使用“solaris clip”即可获得视频剪辑。)

该 Material 是源自 Sun 的 getopt_clip() 的部分示例:
/*

Example 2: Check Options and Arguments.

The following example parses a set of command line options and prints
messages to standard output for each option and argument that it
encounters.

This example can be expanded to be CLIP-compliant by substituting the
long string for the optstring argument:

While not encouraged by the CLIP specification, multiple long-option
aliases can also be assigned as shown in the following example:

:a(ascii)b(binary):(in-file)(input)o:(outfile)(output)V(version)?(help)

*/

static const char *arg0 = 0;

static void print_help(void)
{
printf("Usage: %s [-a][-b][-V][-?][-f file][-o file][path ...]\n", arg0);
printf("Usage: %s [-ascii][-binary][-version][-in-file file][-out-file file][path ...]\n", arg0);
exit(0);
}

static const char optstr[] =
":a(ascii)b(binary)f:(in-file)o:(out-file)V(version)?(help)";

int main(int argc, char **argv)
{
int c;
char *filename;

arg0 = argv[0];
while ((c = getopt_clip(argc, argv, optstr)) != -1)
{
...
}
...
}

关于shell - 在 shell 脚本中使用的可移植 getopt_long 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11722349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com