【问题标题】:Detecting no option with getopt in C (in Linux)在 C 中使用 getopt 检测没有选项(在 Linux 中)
【发布时间】: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() 循环之后,您应该检查optindargc。我想不出argc == -1 会怎样。使用后别忘了退出。
  • @JonathanLeffler 感谢您的补充评论!我知道它现在不能正常工作。我只是从这个脚本开始。首先,当没有提供选项时,我想有一个特殊的文本,如您所见,我坚持使用它。现在,在 Stack 用户的帮助下,我知道如何纠正我的错误。我还将考虑您的其他 cmets。非常感谢你!
  • 请注意,Linux 提供的getopt() 对参数列表做了一些有趣的事情,除非您将环境变量POSIXLY_CORRECT 设置为1 之类的值。特别是,它将在操作数之后查找选项,直到参数列表的末尾(或指示选项结束的 -- 参数),并排列参数以便非选项参数都在结尾。就个人而言,我不喜欢这种行为,但我一定是少数。另请参阅 GNU getopt() 文档。

标签: c linux bash getopt getopts


【解决方案1】:

我认为你需要检查 argc 数字,如果你不传递任何参数(选项)来启动,你的 argc 将为 1,否则 1 + count(options)。

【讨论】:

  • 感谢您的回答! @melpomene 在评论中写了同样的话。我当时错误地理解了getopt......我认为如果getopts与“!= -1”一起使用,那么当它不是“-1”时就有一个选项,我认为当它是“-1”时没有提供了选项。
  • @BloodyMary 很棒。也谢谢你。
猜你喜欢
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多