domingo, 16 de octubre de 2011

Usando parametros posicionales en scripts Bash

Cuando ejecutamos un shell script puede ser útil pasarle argumentos o parámetros a dicho script (por ejemplo, el nombre del fichero sobre el cual queremos que el script trabaje o procese. Estos parámetros son referidos al script de acuerdo a la posición que toman en la línea de comandos: $0 es el nombre del comando o script en sí mismo, $1 es el primer parámetro, $2 es el segundo, y así sucesivamente. No podemos cambiar los valores de esas variables porque son un caso especial (normalmente las variables no pueden comenzar con un dígito, por lo que el shell no interpreta "1=hola" como una asignación de variable).

Un script no puede saber cuántos parámetros posicionales utilizará, por lo que si no controlamos la entrada adecuada de los mismos es problable que el script no trabaje como esperamos.

Como ejemplo vamos a crear un script que llamaremos parametros.sh, el cual contendrá lo siguiente:


#!/bin/bash
echo "Hola, mi nombre es `basename $0`"
echo "Tengo dos parámetros posicionales, que son:"
echo "Primero: $1”
echo “Y el segundo es: $2”

Si ejecutamos este script sin los parámetros posicionales, todo saldrá en blanco:

fraterneo@rainbow:~$ ./parametros.sh
Hola, mi nombre es parametros.sh
Tengo dos parámetros posicionales, que son:
Primero:
Y el segundo es:

Pero cuando lo hacemos con los parámetros requeridos, las cosas funcionan correctamente:

fraterneo@rainbow:~$ ./parametros.sh 34 56
Hola, mi nombre es parametros.sh
Tengo dos parámetros posicionales, que son:
Primero: 34
Y el segundo es: 56

Lo excelente de los parámetros posicionales es que podemos asignarlos a variables, y con el control adecuado para que el script fucione como se espera.

El siguiente es un script (fileownercounter.sh) que nos permite averiguar cuántos ficheros o carpetas le pertenecen a un usuario dentro de una carpeta en particular.

#!/bin/bash
#Autor: Claudio Concepcion
#Fecha: 16.10.2011
#Propósito: Ver la cantidad de ficheros o carpetas que le pertenecen a un usuario dentro de una carpeta particular utilizando parámetros posicionales.

BADPARAM=165
FILECOUNT=0

if [ $# != 2 ]
then
echo Necesitas especificar el usuario y la carpeta, separados por un espacio, para hacer el trabajo.
exit $BADPARAM
fi

USERNAME=$1
WORKDIR=$2
FILECOUNT=`ls -l $WORKDIR | awk '{ print $3 }' | grep $USERNAME | wc -l`

echo El usuario $USERNAME tiene $FILECOUNT ficheros o carpetas en el directorio $WORKDIR.

Como podemos observar, si ejecutan el script, he asignado el parámetro $1 para el nombre de usuario y el parámetro $2 para la carpeta en donde se hará el conteo. Si lo ejecuto para mi usuario en mi directorio home (~/), y luego en el mismo usuario para el directorio /etc, sería lo siguiente:

fraterneo@rainbow:~$ ./fileownercounter.sh fraterneo ~/
El usuario fraterneo tiene 20 ficheros o carpetas en el directorio /home/fraterneo/.

fraterneo@rainbow:~$ ./fileownercounter.sh fraterneo /etc
El usuario fraterneo tiene 0 ficheros o carpetas en el directorio /etc/.

Finalmente, si intentamos ejecutarlo sin especificar los dos parámetros posicionales que requiere, la estrucutra de control if nos advertirá de ello y terminará el script.

fraterneo@rainbow:~$ ./fileownercounter.sh
Necesitas especificar el usuario y la carpeta, separados po un espacio, para hacer el trabajo.

No hay comentarios:

Publicar un comentario