Mi guía de estilos para Bash (Español). Este repositorio es un mirror de: https://gitlab.com/fryntiz/bash-guide-style
Con esta guía de estilos personal pretendo estandarizar la creación de mis propios scripts para que vayan todos uniformes siguiendo unas reglas y un patrón.
El motivo de realizar esta guía es que no encontré una que me gustara lo suficiente, pero sobre todo al no encontrar ninguna estándar y bien aceptada por la comunidad como tal.
Posiblemente hayan guías mejores, soluciones mejores o partes que no gusten demasiado pero esta ha sido mi decisión.
En cualquier caso puedes sugerir cambios mediante Issues y serán debatidos o directamente aceptados si es alguna corrección demostrable.
Todo esto es orientativo
Directrices comunes para todos los scripts en el orden de aparición. Puede apreciarse mejor aún con la plantilla de ejemplo de este repositorio https://gitlab/raupulus/bash-guide-style/blob/master/plantilla.sh.
## Este comentario describe lo que realiza la siguiente variable
#variable='Variable Comentada' ## Comentario en la misma línea
#variable2='Comentario' ## Otro comentario relacionado
variable3='Comentario' ## Este también
El punto y coma “;” se puede usar para separar órdenes, no para terminar una línea.
# MAL:
echo 'Hola mundo';
# BIEN:
echo 'Hola mundo'
Variables dentro de una condición a comprobar [[ -d $variable ]] no se encierran entre comillas
# Variable Global
i='foo'
# Variable local
local i='foo'
# Llamar a la variable
echo "La variable vale $i"
echo "$i"
# Variable como condición a comprobar
if [[ -n $foo ]]; then ## No es necesario encerrar entre comillas
echo "$foo" ## Es necesario encerrarlas entre comillas
# Asignación a otra variable
j=$foo ## Tampoco es necesario encerrarla entre comillas
my_input='' # Cadena vacía, tipo String
my_array=() # Array vacío
my_number=0 # Número vacío, tipo Integer
my_float=0.0 # Número vacío, tipo Float
No usar en ningún momento solo 1 corchete “[ test ]” ← MAL
# MAL :
if [ -d directorio ]; then
...
fi
# BIEN:
if [[ -d directorio ]]; then
...
fi
Una función no puede generar efectos colaterales y retornar (Una cosa u otra).
# MAL:
function foo {
i=foo # Variable declarada como global
}
# BIEN:
foo() {
local i=foo # Variable local a la función (preferible)
}
Las declaraciones de bloque separarán mediante “;” el delimitador de bloque correspondiente (then, do…)
# MAL :
if true
then
...
fi
true && {
...
}
# BIEN:
# Condicional if
if true; then
...
fi
# Bucle while
while true; do
...
done
Las secuencias se deben generar usando métodos propios de bash y no con aplicaciones externas o métodos que puedan ser específicos de un ámbito, distribución o requieran la instalación o uso de herramientas de terceros lo cual podría generar conflictos y disminuirá la compatibilidad.
# MAL:
for f in $(seq 1 10); do
...
done
# BIEN:
for f in {1..10}; do
...
done
for ((i = 0; i < 10; i++)); do
...
done
No se debe usar el comando ls en bucles (loop) ya que es peligroso, en su lugar usar el selector asterisco “*“ en los ejemplos vemos como obtener el mismo resultado.
# MAL:
for f in $(ls); do
...
done
# BIEN:
for f in *; do
...
done
# MAL:
cat archivo | grep foo
# BIEN:
grep foo < archivo
# Mucho mejor
grep foo archivo
Para asignar el resultado de un comando a una variable usar siempre $(comando)
# MAL:
foo=`whoami`
# BIEN:
foo=$(whoami)
En muchas ocasiones trabajaremos incluso mejor con arrays y no necesitaremos bucles for si el comando admite múltiples argumentos aunque también podemos usarlos de esta forma.
# MAL:
modulos='modulo1 modulo2 modulo3'
for modulo in $modulos; do
install "$modulo"
done
# BIEN:
modulos=(modulo1 modulo2 modulo3)
for modulo in "${modulos[@]}"; do
install "$modulo"
done
# AÚN MEJOR:
modulos=(modulo1 modulo2 modulo3)
install "${modulos[@]}" # Pasa todos los argumentos del array de una vez
Un if con múltiples condiciones tendrá alineadas cada una de estas en otra línea terminando en el operador de concatenación como final de línea.
# Bucle while con diversas condiciones
while
condición1
condición2
condición3
do
...
done
# Bucle for con múltiples rutas → Debe llevar barra invertida al final
for x in ruta/a/dir/ \
ruta/a/dir1/ \
ruta/a/dir2/ \
ruta/a/dir3/
do
...
done
# Condicional if con múltiples condiciones
if ( false |
true ) &&
[[ 2 > 1 ]]
then
echo 'Todo se ha cumplido'
else
echo 'No se ha cumplido algo'
fi