Neste post você irá aprender rapidamente como fazer um programinha que é capaz de processar opções recebidas pela linha de comando das seguintes formas:

$ ./greeting -h
Hello World!

$ ./greeting -b
Goodbye Cruel World!

$ ./greeting -hb
Hello World!
Goodbye Cruel World!    

$ ./greeting -o lfz
Hello lfz

$ ./greeting -n 3
Hello!
Hello!
Hello!

Código

Vamos usar uma função da biblioteca padrão do Unix (portanto presente em Linux, Mac, BSD e Windows (compilando com do Mingw)) para realizar a parte difícil do serviço. A seguir, o código inteiro:

#include <stdlib.h>

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

int main(int argc, char **argv)
{
    int i;
    char ch;

    while((ch = getopt(argc, argv, "hbo:n:")) != EOF)
    {
        switch(ch)
        {
            case 'h':
                printf("Hello World!n");
            break;
            case 'b':
                printf("Goodbye Cruel Worldn");
            break;
            case 'o':
                printf("Hello %sn", optarg);
            break;
            case 'n':
                for(i=0; i < atoi(optarg); i++)
                    printf("Hello!n", argv[1]);
            break;
        }
    }

    return 0;
}

O que está acontecendo?

Como vocês podem ver é muito simples. Preste atenção nesta parte do código:

    char ch;

    while((ch = getopt(argc, argv, "hbo:n:")) != EOF)
    {
        ...
    }

Aqui é que acontece toda a mágica. A função getopt recebe o argc (número de argumentos passados pela linha de comando) e o argv (um array com todos os argumentos passados) – ambos parâmetros da função main – e uma “definição” das opções que vamos aceitar. As opções são dadas numa string e são lidas sequencialmente da seguinte maneira:

  • Cada letra é uma opção
  • Uma letra seguida de : é uma opção que requer um parâmetro.

Neste exemplo nós estamos aceitando 4 opções, h, b, o e n das quais as duas últimas recebem um parâmetro.

Cada chamada de getopt retorna um caractere, que nesse caso estamos guardando na variável ch. Este retorno indica a presença do caracter retornado na lista de opções requisitadas pelo usuário. Quando o retorno for EOF não existem mais opções e paramos de processar.

Sabendo disso tudo é fácil entender o que o código faz. Para cada opção, que se encaixa na string "hbo:n:, dada na entrada do programa vamos rodar um código específico dentro do switch, dê uma olhada no exemplo.

Acessando os parâmetros

O parâmetro passado para uma opção pode ser acessado usando a variável global optarg e vem no formato de uma string. Exemplos desse uso podem ser vistos no código acima.

Conclusão

Espero que este post tenha te ajudado :)

Qualquer dúvida ou sugestão pode ser postada nos comentários.