Getopt Not Finding '*' Флаг при попытке использовать - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь использовать getopt, чтобы получить символ '*', когда я делаю

 ls \*

или

 ls \*.c

Я использую это для моей собственной команды ls, в которой я пытаюсь добавить поддержку для подстановки. Ниже приведен код, для которого я пытаюсь использовать команду 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 голосов
/ 12 июля 2019

Нечто подобное можно использовать для получения флагов командной строки -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;
}
...