尝试使用时Getopt找不到'*'标志

时间:2019-07-11 18:34:28

标签: c getopt

我正在尝试使用getopt来获取'*'字符

 ls \*

 ls \*.c

我正在为自己的ls命令使用此命令,试图添加对globbing的支持。下面是我尝试使用getopt命令的代码。

while ((c = getopt(argc, argv, "*laFi1i")) != -1) {
    switch (c) {
        case 'l' : L = 1; break; 
        case 'a' : A = 1; break;
        case 'F' : F = 1; break;
        case 'i' : I = 1; break;
        case '1' : ONE = 1; break;
        case '*' : GLOB = 1; break;
    }
}

为什么当我尝试使用开关盒时却什么也没找到?

谢谢

1 个答案:

答案 0 :(得分:0)

可以使用类似的方法来获取命令行标志-a-F以及其他参数*.c
*.c将被扩展为所有扩展名为.c的文件名。如果有10个匹配的文件,则argc将为12。
命令行可能看起来像./pgm -a *.c

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    int flaga = 0;
    int flagF = 0;
    int flagi = 0;
    int flagl = 0;
    int flag1 = 0;
    int c = 0;
    int each = 0;

    if ( argc == 1) {
        fprintf(stderr, "Usage:\t%s [-a] [-F] [-i] [-l] [-1] [arg...]\n", argv[0]);
        return 1;
    }
    while((c = getopt(argc, argv, "laFi1")) != -1) {

        switch(c) {
            case 'a':
                flaga = 1;
                break;
            case 'F':
                flagF = 1;
                break;
            case 'i':
                flagi = 1;
                break;
            case 'l':
                flagl = 1;
                break;
            case '1':
                flag1 = 1;
                break;
            default:
                fprintf(stderr
                , "Usage:\t%s [-a] [-F] [-i] [-l] [-1] [arg...]\n"
                , argv[0]);
                return 1;
        }
    }
    if ( flaga) {
        printf ( "processed: -a\n");
    }
    if ( flagF) {
        printf ( "processed: -F\n");
    }
    if ( flagi) {
        printf ( "processed: -i\n");
    }
    if ( flagl) {
        printf ( "processed: -l\n");
    }
    if ( flag1) {
        printf ( "processed: -1\n");
    }
    if ( optind < argc) {
        for ( each = optind; each < argc; each++) {
            printf ( "argv[%d] %s\n", each, argv[each]);
        }
    }
    return 0;
}