martes, 30 de mayo de 2017

shift - Accediendo a muchos argumentos

Pero, ¿qué ocurre cuando le damos al programa un gran número de argumentos como en el ejemplo siguiente?:

[me@linuxbox ~]$ posit-param *

Number of arguments: 82
$0 = /home/me/bin/posit-param
$1 = addresses.ldif
$2 = bin
$3 = bookmarks.html
$4 = debian-500-i386-netinst.iso
$5 = debian-500-i386-netinst.jigdo
$6 = debian-500-i386-netinst.template
$7 = debian-cd_info.tar.gz
$8 = Desktop
$9 = dirlist-bin.txt

En este ejemplo, el comodín * se expande en 82 argumentos. ¿Cómo podemos procesar tal cantidad? El shell ofrece un método, aunque burdo, para hacerlo. El comando shift hace que todos los parámetros "bajen uno" cada vez que se ejecute. De hecho, usando shift, es posible hacerlo con sólo un parámetro (además de $0, que nunca cambia):

#!/bin/bash

# posit-param2: script to display all arguments

count=1

while [[ $# -gt 0 ]]; do
    echo "Argument $count = $1"
    count=$((count + 1))
    shift
done

Cada vez que se ejecuta shift, el valor de $2 se mueve a $1, el valor de $3 se mueve a $2 y así sucesivamente. El valor de $# también se reduce en uno.

En el programa posit-param2, creamos un bucle que evalúa el número de argumentos restantes y continúa siempre que haya al menos uno. Mostramos el argumento actual, incrementamos la variable count con cada iteración del bucle para conseguir un contador del número de argumentos procesados y, finalmente, ejecutamos un shift para cargar $1 con el siguiente argumento. Aquí está el programa en funcionamiento:

[me@linuxbox ~]$ posit-param2 a b c d
Argument 1 = a
Argument 2 = b
Argument 3 = c
Argument 4 = d

No hay comentarios:

Publicar un comentario