如何从 getopt 中获取参数以协同工作

Posted

技术标签:

【中文标题】如何从 getopt 中获取参数以协同工作【英文标题】:How to get the arguments from getopt to work together 【发布时间】:2021-12-05 20:13:05 【问题描述】:

我希望能够使用每个参数(-S、-s、-f)并且它们能够一起使用。 -S 打印文件夹中的文件及其大小... -s 如果文件 >= 参数提供的文件大小,则打印文件 -f 查找具有给定子字符串的所有文件。

我如何让它们一起工作?现在,我的代码分别完成所有这些工作。

while((c = getopt(argc, argv, "Ss:f:")) != -1)
    switch(c)
        case 'S':
        // No clue how to make them work together.
            printf("Case: S\n");
            printf("option -%c with argument '%s'\n", c, argv[optind]);
            printDIR(cwd, case_S);
            break;
        case 's':
            printf("Case: s\n");
            printf("option -%c with argument '%s'\n", c, optarg);
            printDIR(cwd, case_s);
            break;
        case 'f':
            printf("Case: f\n");
            printf("option -%c with argument '%s'\n", c, optarg);
            printDIR(cwd, case_f);
            break;
        default:
            printf("...");
    

printDIR 是一个指针函数,这就是为什么我有 cwd(即目录)和 case_S 等等。

我希望能够说...'./search -S -s 1024 -f tar'。这应该递归搜索当前目录并打印文件的大小,如果它 >= 1024 并且文件中包含子字符串 'tar'。但即使我不提供所有参数,我也希望它能够工作。

这是我第一次尝试这样的事情,所以我不熟悉尝试制作 UNIX 命令和使用 getopt args。

【问题讨论】:

如果需要更多代码或上下文,请告诉我。 所以“一起工作”是指您想要实现一个通用 函数来列出文件并使用参数化过滤器过滤文件列表?一起工作是什么意思?为什么不只是 case 'S': print_all_files_and_folders(); case 's': print_filter_grater_then(atoi(optarg)); 等。为什么是 case_S case_s(只使用 'S''s'...)? 处理选项而不执行任何操作。只有当您完成选项处理且没有错误时,您才会考虑做任何事情,例如调用printDIR()。您可能需要更多功能选项,或者选项的位编码。使用argv[optind] 似乎很奇怪,否则您使用(更正确/传统)optarg 请edit您的问题,而不是使用 cmets 添加信息。请在问题中描述您的示例用例。顺便说一句:在 "Ss:f:" 中指定了不带参数的选项“S” 是的。和 'minimum_size = 0' 并用-s 1024 修改它。和const char *filter = ""; 然后用-s tar 修改它。等等。通常,这些是全局变量——但如果你可以通过将它们传递给函数来避免这种情况,那就更好了。 【参考方案1】:

将我的部分 cmets 转换为答案。

您应该在不执行任何操作的情况下处理选项。只有当您完成处理选项并且没有错误时,您才会考虑执行任何操作,例如调用printDIR()。你可能需要更多的函数参数,或者使用全局变量。

你会有这样的标志:

int recursive = 0;

如果搜索是递归的,你可以设置为1。和int minimum_size = 0; 并用-s 1024 修改它。和const char *filter = ""; 然后用-s tar 修改它。等等。通常,这些是全局变量——但如果你可以通过将它们传递给函数来避免这种情况,那就更好了。

你的函数可能会变成:

int printDIR(const char *cwd, int recursive, int minimum, const char *filter);

并且您可以使用适当设置的局部变量来调用它。请注意,您应该在调用printDIR() 之前检查从字符串到整数的转换。

如果有非选项参数,您将在选项处理后处理它们:

for (int i = optind; i < argc; i++)
    printDIR(argv[i], recursive, minimum_size, filter);

【讨论】:

这太棒了!我有一个问题。 -S 将打印大小而 -s 不会。 -s 检查大小但不会打印大小,除非 -S 是一个参数。解决这个问题的最佳方法是什么。 printDIR() 函数中使用一些条件代码。当需要计算和打印尺寸时,请查看选项以确定是否相关。

以上是关于如何从 getopt 中获取参数以协同工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中获取没有名称的参数

在bash中使用getopts来获取可选的输入参数[重复]

shell 脚本参数解析之 getopt getopts

Linux getopt/getopts解析命令行参数教程

shell脚本获取参数&在线执行shell脚本

[记录]Shell中的getopts和getopt用法