Algunos apuntes sobre Bash

bashHe querido recoger algunas notas de Bash scripting para no tener que correr a Google (o a cualquier página de StackExchange) cada vez que las dudas me asalten.

/usr/bin/env bash vs /usr/bin/bash

Leí en la siguiente página sobre las «mejores prácticas en Bash» acerca del uso de «#!/usr/bin/env bash» en lugar del habitual «#!/usr/bin/bash» o «#!/bin/bash«. La idea es usar»#!/usr/bin/env bash» pues de esta manera lo que hacemos es buscar en el PATH dónde está bash, el cual es probable se encuentre en ubicaciones distintas en servidores diferentes. Ésto evitará problemas portando scripts a otros entornos. [Más info] [2]

#!/usr/bin/env bash

Corchete simple vs Doble corchete

Básicamente, ambos sirven para evaluar expresiones. «[» es un alias para el comando «test» y tanto uno como el otro están disponibles en el estándar POSIX. «[[» sin embargo es una keyword, no un programa, y se trata una versión mejorada para evaluar expresiones, únicamente disponible en Bash, KornShell y Zsh. Si no estás preocupado por la portabilidad de tus scripts con sistemas donde no cuentes con Bash, es mejor usar siempre el doble corchete, por la funcionalidad extra que aporta (posibilidad de usar && y ||, expresiones regulares, pattern matching, etc.). [Más info] [2]

La siguiente evaluación será «true» pues b és mayor que a, 8 mayor que 4, y abcd entra dentro del patrón «a*»:

if [[ b > a && 8 -gt 4 && abcd = a* ]]; then ...

PD: Dejo un enlace a la wikipedia donde se especifican los nombres en inglés de éstos símbolos, según la zona.

Doble paréntesis

El doble paréntesis en Bash se usa para evaluaciones aritméticas (casi idéntico a «let«), además de permitir manipulación de variables como lo haríamos en C, tipo (( var++ )).

Si ejecutásemos en Bash la siguiente instrucción, devolvería por pantalla el string «3+4»:

a=3+4; echo $a

En cambio, con el doble paréntesis podemos manipular operaciones aritméticas. Lo siguiente devolverá el número 10:

a=$(( 3 + 4 )); b=$(( a + 2 )); (( b++ )); echo $b

Comillas y dobles comillas

Todos los carácteres en una expresión entre comillas, son tratados como un string.

a=50;echo 'Aquí hay $a personas'
Salida: Aquí hay $a personas

Las dobles comillas en cambio, permiten la expansión de los carácteres especiales ‘$’, ‘`’ y ‘\’ [Más info] [2]:

a=50;echo "Aquí hay $a personas"
Salida: Aquí hay 50 personas

Control de errores y debug

En muchos sitios (aquí o aquí, por ejemplo) se insta a usar siempre, al inicio del script, el comando «set -e» (o lo que es lo mismo, «set -o errexit«) lo cual detendrá la ejecución del script en caso de que algún comando produzca algún error. Sin embargo, al parecer en ocasiones ésto puede hacer que nuestro script no funcione como esperábamos, así que conviene ir con cuidado. [Más info] [2]

#!/usr/bin/env bash
set -e

Referente al debug, podemos ejecutar un script en modo debug añadiéndo al incio del script «set -x» o ejecutándo el script directamente con «bash -x <script>».

#!/usr/bin/env bash
set -x

Update: A Marzo de 2017 Julia Evan (@b0rk) ha creado una «chuleta» muy interesante a la que darle un vistazo.

Fuentes

http://mywiki.wooledge.org/BashFAQ/

http://kvz.io/blog/2013/11/21/bash-best-practices/

http://mywiki.wooledge.org/BashGuide/Practices

Writing Robust Bash Shell Scripts

Deja una respuesta

Tu dirección de correo electrónico no será publicada.