- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想解析 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
在示例中。
getopt()
函数)来描述选项。 (谷歌:“solaris clip 命令行界面范式”;仅使用“solaris clip”即可获得视频剪辑。)
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/
我正在为名为 fp 的命令编写以下代码,该命令存在于一个框架中,用于处理这些已存在的命令。我对 C 相当陌生,我正在尝试使用 getopt_long() 解析此命令的一些参数。目前,参数除了打印参数名
我正在使用 getopt_long 读取命令行选项。代码: #include #include #include int main(int argc, char *argv[]) { i
int next_option; int keep_content =0; int option_index = 0; const string short_options = "c::"; con
我正在编写一些代码来解析命令行输入。我使用getopt_long的方式如下: int c = 0; static struct option long_options[] = { {"mod
我正在使用 getopt 和 getopt_long 来解析 C++ 程序的参数。当正确给出参数时,我没有问题。此外,当给出错误的短参数时,错误消息会正确打印。但是当给出错误的长参数时,我没有收到它的
我有下面的代码。但是当我用 --debug=2 运行它时,调试变量的值为 100。我期望 2...我的错误在哪里?这里的代码: int debug=0; int opt; struct o
int main(int argc , char *argv[]) { int c; int sock; struct sockaddr_in server; char
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: getopt_long() — proper way to use it? 我在 C 程序中遇到 getop
我在解析我正在编写的程序中的参数时遇到问题,代码如下: void parse_args(int argc, char** argv) { char ch; int index = 0;
我是第一次尝试使用 getopt_long() 函数,只是我遇到了不是标志的参数的问题。例如,在我的代码中,当给出一个未知参数时,我想将它用作输入文件。当我只使用一个文件名运行它时,它不会被打印出来,
我正在尝试使用 getopt_long 进行一些基本的选项解析。我的具体问题是当不使用该选项时默认的 int 值被覆盖。我已经通读了文档和一些关于 getopt 的解释,但没有看到任何关于保留默认值/
如果给定一个选项,是否可以告诉 getopt_long 我需要两个参数? 例如,如果 -i 存在,接下来需要两个参数,如果它们不存在,解析将失败。 最佳答案 根据manual和 getopt_long
我一直在阅读如何使用 getopt_long(),以及如何使用 optlong“读取”多字符选项。 我需要从终端解析以下条目: ./bomb –n String –cp Integer –i Inte
我有以下代码 #include #include int main(int argc, char* argv[]){ const struct option longo
当 getopt 或 getopt_long 遇到非法选项时,它将违规选项字符存储在 optopt 中。当非法选项是一个long 选项时,我在哪里可以找到该选项是什么?然后,optopt 中是否存储了
好的,我已经搜索并找到了以下两个 StackOverflow 主题,这些主题让我开始了正确的方向: Argument-parsing helpers for C/UNIX Pass arguments
使用gcc -Wall getopt.c -o options进行编译并运行一些示例后,乍一看似乎可以工作。故意绊倒它会导致段错误。 //straight from the man page stat
这是我的第一个使用 getopt_long() 的程序,所以如果这个问题很琐碎,请原谅我。 当传递给我的程序的第一个参数无效时,我遇到了问题 这是我的主要代码 int main(int argc, c
我正在尝试使用 getopt_long() 创建一个带有可选参数的选项。 这是我的代码: static struct option long_options[] = { {"help", n
我想根据是否存在特定参数来委托(delegate)几个可能的参数列表之一,大致如下: ./test --do-thing-1 --option-A=7 --common-option --option
我是一名优秀的程序员,十分优秀!