如何让 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);
我希望能够使用每个参数(-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);