【发布时间】:2019-04-20 17:04:15
【问题描述】:
我想在 Linux 中使用终端编写一个简单的 C 程序。我不知道如何检查程序执行期间是否没有提供任何选项:
./program.a
这是我的脚本:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int opt;
while ((opt = getopt (argc, argv, "il:")) != -1)
switch (opt)
{
case 'i':
printf("This is option i");
break;
case 'l':
printf("This is option l");
break;
default:
fprintf(stderr,"Usage: %s [-i] opt [-l] opt\n",argv[0]);
}
if (argc == -1) {
printf("Without option");
}
}
所以输出为:
./program.a
应该是:
"Without option"
我尝试使用“if”来执行此操作,并将 argc 设置为 -1、0 或 NULL,但它不起作用。我知道在 bash 中我可以这样使用: if [ $# -eq 0] 或 if [-z "${p}" ],检查是否没有提供选项,但在 CI 中不知道如何检查那……
我还有第二个问题:是否可以在一个脚本/程序中以某种方式将 bash 函数与 C 代码结合起来?
感谢您的任何提示。 乙
【问题讨论】:
-
if (argc == 1)。也许暂时忘记getopt,而只是玩弄各种运行程序的方式以及argc/argv中的相应值。 -
@melpomene 感谢您的回复!所以它是如此接近......但是,我不明白为什么它是“1”。 Getopts 与“!= -1”一起使用,所以我知道如果它不是“-1”,那么就有一个选项,所以当它是“-1”时,没有提供选项。
-
您的使用信息与
getopt()选项字符串il:不相关。在经典(非 Linux)命令行中,您在非选项“操作数”之前指定选项和选项参数。-i选项不带参数;-l选项可以。名义上,您的使用消息应该是Usage: %s [-i] [-l opt] arg ...\n"或类似的东西。并不完全清楚您的期望,因为当-l被捕获时您没有捕获optarg。在getopt()循环之后,您应该检查optind和argc。我想不出argc == -1会怎样。使用后别忘了退出。 -
@JonathanLeffler 感谢您的补充评论!我知道它现在不能正常工作。我只是从这个脚本开始。首先,当没有提供选项时,我想有一个特殊的文本,如您所见,我坚持使用它。现在,在 Stack 用户的帮助下,我知道如何纠正我的错误。我还将考虑您的其他 cmets。非常感谢你!
-
请注意,Linux 提供的
getopt()对参数列表做了一些有趣的事情,除非您将环境变量POSIXLY_CORRECT设置为1之类的值。特别是,它将在操作数之后查找选项,直到参数列表的末尾(或指示选项结束的--参数),并排列参数以便非选项参数都在结尾。就个人而言,我不喜欢这种行为,但我一定是少数。另请参阅 GNUgetopt()文档。
标签: c linux bash getopt getopts