Section: Manual del Programador de Linux (3)
Updated: 8 mayo 1998
Index Return to Main
Contents
getopt - Analiza las opciones de la línea de órdenes
#include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt; #define _GNU_SOURCE
#include <getopt.h> int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex); int getopt_long_only(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
La función getopt() analiza los argumentos de la línea de órdenes. Sus argumentos argc y argv son el número y el vector de argumentos como los pasados a la función main() cuando se ejecuta el programa. Un elemento de argv que comience con '-' (y que no sea exactamente "-" ni "--") es un elemento de opción. Los caracteres de este elemento (aparte del '-' inicial) son caracteres de opción. Si getopt() se llama repetidamente, devuelve sucesivamente cada uno de los caracteres de opción de cada uno de los elementos de opción.
Si getopt() encuentra otro carácter de opción, lo devuelve, actualizando la variable externa optind y una variable estática nextchar de forma que la siguiente llamada a getopt() pueda seguir la búsqueda en el siguiente carácter de opción o elemento de argv.
Si no hay más caracteres de opción, getopt() devuelve -1. Entonces optind es el índice en argv del primer elemento de argv que no es una opción.
optstring es una cadena que contiene los caracteres de opción legítimos. Si un carácter de éstos es seguido por el carácter de dos puntos, la opción necesita un argumento, de forma que getopt coloca un puntero al texto siguiente en el mismo elemento de argv, o el texto del siguiente elemento de argv, en optarg. Dos caracteres de dos puntos significan que una opción toma un arg. opcional; si hay texto en el elemento de argv actual, se devuelve en optarg; si no, optarg se pone a cero. Lo siguiente es una extensión de GNU. Si optstring contiene W seguido por un punto y coma, entonces -W foo se trata como la opción larga --foo. (La opción -W está reservada en POSIX.2 para extensiones de implementación). Este comportamiento es una extensión de GNU, no disponible en bibliotecas anteriores a la versión 2 de GNU libc.
Por omisión, getopt() permuta los contenidos de argv cuando lo escudriña, de modo que todo lo que no sea una opción vaya al final. Están implementados otros dos modos de operación. Si el primer carácter de optstring es '+' o está definida la variable de ambiente POSIXLY_CORRECT, entonces el procesamiento de la opción se para tan pronto se encuentra un argumento que no es una opción. Si el primer carácter de optstring es '-', entonces cada elemento de argv que no sea una opción se maneja como si fuera el argumento de una opción con código de carácter 1. (Esto se usa en programas que fueron escritos para esperar opciones y otros elementos de argv en cualquier orden y donde importa el ordenamiento de ambos). El argumento especial '--' fuerza que se acabe el rastreo de las opciones sin tenerse en cuenta el modo.
Si getopt() no reconoce un carácter de opción, muestra un mensaje de error en stderr, guarda el carácter en optopt, y devuelve '?'. El programa que llama a la función puede evitar el mensaje de error poniendo opterr a 0.
La función getopt_long() trabaja como getopt() salvo en que también acepta opciones largas, que empiezan por dos guiones. Los nombres de opción largos pueden abreviarse si la abreviatura es única o si es una concordancia exacta para alguna opción definida. Una opción larga puede tomar un parámetro, de la forma --arg=param o --arg param.
longopts es un puntero al primer elemento de un vector de struct option declarado en <getopt.h> como
struct option { const char *name; int has_arg; int *flag; int val; };
Los significados de los diferentes campos son:
El último elemento del vector tiene que ser llenado con ceros.
Si longindex no es NULL, apunta a una variable que toma el valor del índice de la opción larga relativa a longopts.
getopt_long_only() es como getopt_long(), pero tanto `-' como `--' pueden indicar una opción larga. Si una opción que empiece por `-' (no `--') no concordara con una opción larga, pero sí con una corta, se consideraría como tal.
La función getopt() devuelve el carácter de la opción si ésta se ha encontrado, ':' si faltaba un parámetro de alguna de las opciones, '?' para un carácter de opción desconocida, o -1 si se ha llegado al final de la lista de opciones.
getopt_long() y getopt_long_only() también devuelven el carácter de la opción cuendo se reconoce una corta. Para una opción larga, devuelven val si flag es NULL, y 0 en otra circunstancia. Las devoluciones de error y -1 son las mismas que para getopt(), más '?' indicando una concordancia ambigua o un parámetro extraño.
El siguiente programa de ejemplo, del código fuente, ilustra el empleo de getopt_long() con la mayoría de sus características.
#include <stdio.h> int main (int argc, char **argv) { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 1, 0, 'c'}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:012", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf ("optción %s", long_options[option_index].name); if (optarg) printf (" con arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("hay dígitos en dos elementos de argv diferentes.\n"); digit_optind = this_option_optind; printf ("opción %c\n", c); break; case 'a': printf ("opción a\n"); break; case 'b': printf ("opción b\n"); break; case 'c': printf ("opción c con valor `%s'\n", optarg); break; case 'd': printf ("opción d con valor `%s'\n", optarg); break; case '?': break; default: printf ("?\? getopt() devolvió el carácter de código 0%o ?\?\n", c); } } if (optind < argc) { printf ("elementos de ARGV que no son opciones: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } return (0); }
Esta página de manual no hay quien la entienda.
La especificación POSIX.2 de getopt() tiene un error técnico descrito en la Interpretación 150 de POSIX.2. La implementación GNU (y probablemente el resto de implementaciones) implementa el comportamiento correcto en lugar del indicado.
This document was created by man2html, using
the manual pages.
Time: 06:16:26 GMT, January 22, 2005