bashf

A continuación te indicamos los pasos que puedes seguir para asegurarte de que tus scripts bash funcionan como es debido y son fáciles de actualizar.

La asignación de tareas rutinarias e incluso de las que rara vez se necesitan a guiones es casi siempre una gran ventaja, ya que no hay que reinventar el método para realizar el trabajo cada vez que se necesita y se ahorra mucho tiempo en cuestiones que se tratan a menudo. En el artículo original nos muestra todo lo que podemos hacer para manejar y programar mejor nuestros scripts.

Aquí tienes algunos consejos para escribir scripts bash y asegurarte de que serán fáciles de usar, fáciles de actualizar/ y difíciles de usar mal.

Comentarios

Una cosa importante que hacer cuando estás preparando un script en Linux es añadir comentarios - especialmente para comandos que pueden ser un poco complejos. Si no ejecutas un script muy a menudo, los comentarios pueden ayudarte a asegurarte de que comprendes rápidamente todo lo que está haciendo. Si alguien más tiene que usar tus scripts, los comentarios pueden hacer que sea mucho más fácil para ellos saber qué esperar. Por tanto, añade siempre comentarios. Incluso tú los agradecerás. No necesitas comentar cada línea, sólo cada grupo significativo de comandos. He aquí un ejemplo sencillo.

#!/bin/bash

# function to replace spaces in provided text with underscores
replspaces () {
  echo $@ | sed 's/ /_/g'
}

# function to remove spaces from the provided text
dropspaces () { echo $@ | sed 's/ //g'; }

# commands to call the functions defined above
replspaces "Hello World"
replspaces `date`
dropspaces "Hello World"
dropspaces `date`

El script anterior define dos funciones: una para convertir los espacios en guiones bajos y otra para eliminar todos los espacios de cualquier cadena que se introduzca en el prompt. Los comentarios dicen lo suficiente para explicar esto.

Uso de funciones

Como se indica en el script anterior, las funciones pueden ser muy útiles. Esto es especialmente cierto cuando un único script ejecutará las funciones muchas veces. Los scripts serán más cortos y más fáciles de entender.

Verificación de argumentos

Acostúmbrese a hacer que sus scripts verifiquen que quien los ejecuta ha proporcionado los argumentos adecuados. Puede comprobar el número de argumentos, pero también puede verificar que las respuestas son válidas. Por ejemplo, si pide el nombre de un archivo, compruebe que el archivo proporcionado existe realmente antes de ejecutar comandos que intenten utilizarlo. Si no existe, responda con un error y salga.

El siguiente script comprueba que se han proporcionado dos argumentos al script. Si no es así, solicita la información necesaria.

#!/bin/bash

if [ $# -lt 2 ]; then
    echo "Usage: $0 lines filename"
    exit 1
else
    numlines=$1
    filename=$2
fi
…

El siguiente script solicita un nombre de archivo y comprueba si existe.

#!/bin/bash

# get name of file to be read
echo -n "filename> "
read $filename

# check that file exists or exit
if [ ! -f $filename ]; then
    echo "No such file: $filename"
    exit
fi

Si es necesario, también puede comprobar si el archivo es de escritura o de lectura. La versión del script de abajo hace ambas cosas.

#!/bin/bash

# get name of file to be read
echo -n "filename> "
read filename

# check that file exists or exit
if [ ! -f $filename ]; then
    echo "No such file: $filename"
    exit
else # determine if file is readable
    if [ ! -r $filename ]; then
        echo "$filename is not writable"
        exit
    fi
# determine if file is writable if [ ! -w $filename ]; then echo "$filename is not readable" exit fi fi

Nota: La opción -r $nombre_archivo pregunta si el archivo es legible. La comprobación ! -r $nombrearchivo pregunta si no es legible.

Salir en caso de error

Casi siempre se debe salir cuando se encuentra un error al ejecutar un script. Explique con un mensaje de error lo que salió mal. El set -o errexit hará que el script salga independientemente del tipo de error encontrado.

#!/bin/bash

set -o errexit  # exit on ANY error

tail NoSuchFile # tries to show bottom lines in NON-EXISTENT file
echo -n "Enter text to be appended> "
read txt
echo $txt >> NoSuchFile

El script anterior saldrá si el archivo "NoSuchFile" no existe. También se mostrará un error.

Para salir cuando a una variable no se le ha asignado un valor (es decir, no existe), utilice la opción nounset como se muestra en el script de abajo. Un comando set -u funciona igual.

#!/bin/bash

# exit script if an unset variable is used
set -o nounset

# welcome user with a greeting
echo $greeting

echo -n "Enter name of file to be evaluated: "
read filename

Si ejecuta el script tal cual, se encontrará con el problema que se muestra a continuación y nunca se le pedirá que procese el archivo:

$ ck_nounset
./ck_nounset: line 7: greeting: unbound variable

Trabajar con comillas

En muchos casos, no importa si utiliza comillas simples, dobles o ninguna. Poner comillas alrededor del nombre de una variable en una sentencia if significa que no se encontrará con un error si la variable no está definida. El shell nunca terminará intentando evaluar el comando inválido if [ = 2 ]. El comando if [ "" = 2 ] es válido.

if [ "$var" = 2 ]

Es esencial entrecomillar los argumentos que contengan más de una cadena. Tendrías problemas con el siguiente script si el usuario que respondiera a la pregunta de bueno/malo introdujera "muy bueno" en lugar de sólo "bueno" o "malo".

#!/bin/bash

echo -n "Did you find the argument to be good or bad?> "
read ans

if [ $ans = good ]; then
  echo "Thank you for your feedback"
else
  echo -n "What didn't you like?> "
  read ans
  echo $ans >> bad_feedback
fi

En su lugar, podría utilizar una línea como ésta para hacer la comparación. Esto permitiría responder "bien" o "muy bien".

if [[ "$ans" = *"good" ]]; then

Utilizar = o ==

La mayoría de las veces no hay diferencia entre usar = o == para comparar cadenas. Sin embargo, algunos shells (por ejemplo, dash) no funcionan con ==, así que ahórrese las pulsaciones y utilice = si no está seguro.

Permisos de archivos

Asegúrate de que tus scripts pueden ser ejecutados por cualquiera que deba poder utilizarlos. Un comando chmod -ug+rx nombrearchivo te daría a ti (presumiblemente el propietario del archivo) y a cualquiera en el grupo asociado con el archivo la capacidad de leer y ejecutar el script.

Prueba tus scripts

No olvides dedicar algo de tiempo a las pruebas para asegurarte de que tus scripts hacen exactamente lo que pretendes. Las pruebas pueden incluir cosas como no responder a las instrucciones del script para ver cómo reacciona.

 

Fuente: somoslibres

¿Quién está en línea?

Hay 29435 invitados y ningún miembro en línea