如何让 getopt 的参数协同工作

How to get the arguments from getopt to work together

我希望能够使用每个参数(-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。

正在将我的部分评论转化为答案。

您应该在不执行任何操作的情况下处理这些选项。只有当您完成选项处理且没有错误时,您才会考虑调用 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);