lunes, 5 de junio de 2017

Manejando parámetros posicionales en masa

A veces es útil manejar todos los parámetros posicionales como un grupo. Por ejemplo, podríamos querer escribir un "envoltorio" alrededor de otro programa. Esto significa que creamos un script o función de shell que simplifique la ejecución de otro programa. El envoltorio proporciona una lista de opciones arcanas de la línea de comandos y luego pasa una lista de argumentos al programa de nivel inferior.

El shell ofrece dos parámetros especiales para este propósito. Ambos se expanden en la lista completa de parámetros posicionales, pero difieren en cosas muy sutiles. Son:

Tabla 32-1: Los parámetros especiales * y @
Parámetro Descripción
$* Se expande en la lista de parámetros posicionales, comenzando por 1. Cuando lo incluimos entre comillas dobles, se expande en una cadena con comillas dobles conteniendo todos los parámetros posicionales, cada uno separado por el primer carácter de la variable de shell IFS (por defecto un carácter espacio).
$@ Se expande en la lista de parámetros posicionales, comenzando por 1. Cuando lo incluimos entre comillas dobles, expande cada parámetro posicional en una palabra separada entre comillas dobles.

Aquí tenemos un script que muestra estos parámetros especiales en acción:

#!/bin/bash

# posit-params3 : script to demonstrate $* and $@

print_params () {
    echo "\$1 = $1"
    echo "\$2 = $2"
    echo "\$3 = $3"
    echo "\$4 = $4"
}

pass_params () {
    echo -e "\n" '$* :'; print_params $*
    echo -e "\n" '"$*" :'; print_params "$*"
    echo -e "\n" '$@ :'; print_params $@
    echo -e "\n" '"$@" :'; print_params "$@"
}

pass_params "word" "words with spaces"

En este programa tan complicado, creamos dos argumentos: "word" y "words with spaces", y los pasamos a la función pass_params. Esa función, a su vez, los pasa a la función print_params, usando cada uno de los cuatro métodos disponibles con los parámetros especiales $! y $@. Cuando lo ejecutamos, el script revela las diferencias:

[me@linuxbox ~]$ posit-param3

 $* :
$1 = word
$2 = words
$3 = with
$4 = spaces

 "$*" :
$1 = word words with spaces
$2 =
$3 =
$4 =

 $@ :
$1 = word
$2 = words
$3 = with
$4 = spaces

 "$@" :
$1 = word
$2 = words with spaces
$3 =
$4 =

Con nuestros argumentos, tanto $! como $@ producen un resultado de cuatro palabras:

word words with spaces

"$*" produce un resultado de una palabra:

    "word words with spaces"

"$@" produce un resultado de dos palabras:

    "word" "words with spaces"

que coincide con nuestra intención real. La lección que aprendemos de esto es que aunque el shell proporciona cuatro formas diferentes de obtener la lista de parámetros posicionales, "$@" es de lejos la más útil para la mayoría de los casos, porque conserva la integridad de cada parámetro posicional.

No hay comentarios:

Publicar un comentario