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.