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.