Ejemplos de Scripts de Shell

Ejemplos de Scripts de Shell

Todos los scripts están diseñados para ejecutarse en el shell bash, pero tampoco debe suponer demasiadadificultad utilzarlos en otra shell de tipo Bourne.

En estos ejemplos además, de una forma práctica, vamos a recordar, repasar e introducir ciertos conceptos teóricos. De todas formas, para aprovechar estos ejemplos y ganar tiempo y conocimientos, deberías leer el capítulo de programación en shell.

Ni que decir tiene que es necesario conocer todas las órdenes de Unix que vamos a utilizar en los ejemplos propuestos.

He intentado secuenciar los script por temas y por dificultad aunque esto no es siempre posible.


Parámetros posicionales y variables internas

Diversos ejemplos de scripts donde se contemplan diversas posibilidades del uso de parámetros posicionales en un script de shell.

Script que muestra los tres primeros parámetros pasado en la línea de órdenes

Los parámetros que se pasan a un script los podemos encontrar en las variables $1, $2, ... También resulta útil $0 que contiene el nombre del script. En este caso bastaría:

echo $1 $2 $3

Script que muestra el número de parámetros pasados

Con este script quiero que observes que hay ciertas variables que proporcionan información en un script. Por ejemplo, una variable que resulta muy útil es $#, que contiene el número de argumentos. En este caso nuestro script quedaría como:

echo $#

Script que escribe todos los parámetros pasados en una línea

Con este script quiero repasar las variables $@ y $* que contienen la lista de argumentos, con una pqueña diferencia: $@ separa los distintos argumentos por un espacio mientras que $* los separa según el contenido de la variable IFS (Internal Field Separator), que en principio también es un espacio.

Entonces nuestro script quedaría como:

echo $*

o

echo $@

Esta variables también serán de gran utilidad.


Script que escribe todos los parámetros pasados en una línea y separados por el signo +

Si vemos el ejemplo anterior podemos deducir que si ponemos IFS=+ ahora el separador de campos será el que nos interesa:

IFS=+
echo $*

y escribirá todos los parámetos separados por +


condiciones (test)

Distintas posiblidades de valuar condiciones de carácter verdadero o falso que permiten dirigir el flujo de la ejecución del script.

Script que comprueba que hay dos parámetros posicionales

En este script tenemis que tomar una decisión dependiendo del contenido de la variable $# como vimos en un ejemplo anterior.

if [ $# -eq 2 ]
then
        echo "Hay dos parámetros"
fi

if [ $# -eq 2 ] Comprobamos si el número de argumentos es dos con una comparación numérica.

Todo lo que pongamos tras "then" y hasta el (else) "fi" se ejecurará cuando la condición sea cierta.

Este ejmplo resulta particularmente útil para construir scripts que deban tener un número exacto de parámetros.


Script que comprueba si los dos parámetros son iguales

if [ $1 == $2 ]
then
        echo "Los parámetros son iguales"
fi

Destacamos aquí:

if [ $1 == $2 ] Realizamos una comparación de cadenas de caracteres.


Script que escribe «IGUALES» si los dos parámetros posicionales pasado son iguales y «DISTINTOS» en otro caso

Ahora empezamos con las comparaciónes para poder tomar una decisión dentro del script. Según el enunciado vamos a suponer que el script tiene sólo dos argumentos; después vamos a comparar los argumentos y mostrar lo que se pide:

if [ $# -eq 2 ]
then
        echo "Uso: $0 arg1 arg2"
        exit
fi
if [ $1 == $2 ]
then
        echo "IGUALES"
else
        echo "DISTINTOS"
fi

Analizamos el programa:

En primer lugar, en general vemos que un if puede tener o no un "else" asociado, como en cualquier lenguaje.

Y con más detalle, vemos las línea más significativas:

echo "Uso: $0 arg1 arg2" Mostramos un mensaje sobre como se usa el script. Observamos que $0 es el nombre del script.

exit Da por terminado el script, puesto que al no tener los argumentos necesarios no debería continuar su ejecución.


Ficheros y directorios (1)

Ejemplos que gestionan ficheros y directorios.

Nota: Todos los script que requieran un número exacto de parámetros deben realizar la comprobación del número de parámetros


Script que dice «Es un fichero» si el argumento pasado es un fichero regular. En otro caso debe escribir «No es un fichero».

El objetivo de este script es hacer prácticas con las condiciones que proporciona bash para realizar comprobaciones del sistema de ficheros, comprobar ficheros, directorios, permisos, etc.

En primer lugar deberemos verficar el número de argumentos como veíamos en el ejemplo anterior y postriormente comprobamos si el argumento se corresponde con un fichero:

if [ $# -eq 1 ]
then
        echo "Uso: $0 fichero"
        exit
fi
if [ -f $1 ]
then
        echo "$1 es un fichero"
else
        echo "$1 NO es un fichero"
fi

La opción "-f" de la orden test o "[ ]" devuelve "Verdadero" si el valor que indicamos se corresponde con un fichero regular. Aconsejo un repaso a las distintas condiciones para comprobar otros tipos de ficheros como pipes, dispositivos o enlaces.

Si tenemos ficheros con nombres que contengan espacios y otro metacarácter, el argumento debería estar entre comillas dobles:

if [ $# -eq 1 ]
then
        echo "Uso: $0 fichero"
        exit
fi
if [ -f "$1" ]
then
        echo "$1 es un fichero"
else
        echo "$1 NO es un fichero"
fi

Script que dice «Es un directorio» si el argumento pasado es un directorio. En otro caso debe escribir «No es un directorio».

Este script es idéntico al anterior salvo que tenemos que modificar la condición para comprobar directorios:

if [ $# -eq 1 ]
then
        echo "Uso: $0 fichero"
        exit
fi
if [ -d $1 ]
then
        echo "$1 es un directorio"
else
        echo "$1 NO es un directorio"
fi

Script que dice «Es un enlace» si el argumento pasado es un enlace simbólico. En otro caso debe escribir «No es un enlace simbólico».

Este ejemplo también es idéntico a los anteriores cambiando la condición:

if [ $# -eq 1 ]
then
        echo "Uso: $0 fichero"
        exit
fi
if [ -h $1 ]
then
        echo "$1 es un enlace simbólico"
else
        echo "$1 NO es un enlace simbólilco"
fi

Script que escribe las características del fichero o directorio, pasado como argumento: tipo y permisos.

En este ejemplo vamos a ver un resumen de distintas condiciones que podemos consulatr al sistema de ficheros. Además, vamos a ver como podemos concatener cadenas de caracteres.

if [ $# -eq 1 ]
then
        echo "Uso: $0 fichero"
        exit
fi
FICHERO="$0: "
if [ -f $1 ]
then
        FICHERO="$FICHERO fichero"
else

if [ -d $1 ]

       then
                FICHERO="$FICHERO directorio"
        else

echo "$FICHERO otro tipo"

fi

fi

if [ -r $1 ]
then
        FICHERO="$FICHERO lectura"
fi
if [ -w $1 ]
then
        FICHERO="$FICHERO escritura"
fi
if [ -x $1 ]
then
        FICHERO="$FICHERO ejecución"
fi

Como novedad de este script destacamos un "if" anidado, un "if" dentro de otro.


Script que escribe el tipo de fichero pasado como argumento.

En este ejemplo vemos otras condiciones posibles que podemos comprobar:

if [ $# -eq 1 ]
then
        echo "Uso: $0 fichero"
        exit
fi
if [ -f $1 ]
then
        echo "$1 Fichero regular"

fi

if [ -d $1 ]
then
        echo "$1 directorio"

fi

if [ -c $1 ]
then
        echo "$1 dispositivo carácter"

fi

if [ -b $1 ]
then
        echo "$1 dispositivo bloque"

fi

if [ -p $1 ]
then
        echo "$1 tubería con nombre"

fi


Script que muestre el contenido de su argumento, si es un directorio muestre los ficheros que contiene y si es un fichero su contenido.

if [ -f $1 ]
then
        cat $1
fi
if [ -d $1 }
then
        ls $1
fi