Paso de parámetros a través de la línea de ódenes



La forma de ejecutar un programa es bien conocida: basta escribir el nombre del programa en la terminal y pulsar <INTRO>. Por ejemplo, es frecuente escribir lo siguiente para ejecutar un programa:

magallanes:~ coti$ ./a.out
Hola,Mundo!
magallanes:~ coti$

Cabe preguntarse lo que sucederá si se escribe algo más que el nombre del programa. Aparentemente, nada:

magallanes:~ coti$ ./a.out alfa beta gamma 1 2 3
Hola,Mundo!
magallanes:~ coti


Sin embargo, lo ocurrido es que la shell (sh, bash, zshell o cualquier otra) ha detectado la presencia de información adicional en la línea de órdenes, y ha pasado esa información al programa ejecutado, a través de los parámetros de main(), argc y argv .

Concretamente, se ha almacenado el número total de expresiones (bloques de caracteres separados por espacios o tabuladores) en la variable argc de main(), y una lista de punteros de carácter que apuntan a cada una de esas expresiones en argv[] . Esto implica que el programa puede hacer uso de la información aportada. Veamos un ejemplo.

Ejercicio .- Escribir un programa que muestre en pantalla el número total de argumentos que reciba a través de la línea de órdenes, así como los valores de esos argumentos.

#include <stdio.h>

int main(int argc, char * argv[]) {
  int i;
  printf("El número de argumentos es: %d\n\n", argc);
  if (! (argc > 1) )
    {
      printf("El único argumento es el nombre del programa: %s\n\n",
		argv[0]);
    }
  else
    {
      printf("La relación de argumentos recibidos es:\n\n");
      for(i=0;i<argc;i++)
        {
          printf("Argumento nº %2d: %s\n", i, argv[i]);
        }
   }
  printf("\n\nTerminación normal del programa\n\n");
  return 0;
}


El resultado de ejecutar este programa (sin argumentos adicionales primero, y con argumentos adicionales después) es como sigue:

magallanes:test coti$ a.out
El número de argumentos es: 1

El único argumento es el nombre del programa: a.out



Terminación normal del programa

magallanes:test coti$ ./a.out alfa beta gamma 1 2 3
El número de argumentos es: 7

La relación de argumentos recibidos es:

Argumento nº  0: ./a.out
Argumento nº  1: alfa
Argumento nº  2: beta
Argumento nº  3: gamma
Argumento nº  4: 1
Argumento nº  5: 2
Argumento nº  6: 3


Terminación normal del programa

magallanes:test coti$


Como puede observarse, el programa ha recibido todas las expresiones escritas en la línea de ordenes (la expresión de índice 0 es el nombre del programa; la expresion de índice 1 ( argv[1] ) es la primera que se escriba tras el nombre del programa, y así sucesivamente.

Obsérvese que se trata de cadenas de caracteres. Si se pasan valores numéricos a través de la línea de órdenes, es preciso efectuar una traducción al formato binario.