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.