项目作者: fryntiz

项目描述 :
Mi guía de estilos para Bash (Español). Este repositorio es un mirror de: https://gitlab.com/fryntiz/bash-guide-style
高级语言: Shell
项目地址: git://github.com/fryntiz/bash-guide-style.git
创建时间: 2017-12-21T17:41:22Z
项目社区:https://github.com/fryntiz/bash-guide-style

开源协议:GNU General Public License v3.0

下载


Bash_Style_Guide

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.

Guía de estilos Bash Logo

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

Estructura de los scripts

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.

  • Declaración de intérprete de comandos
  • Codificación UTF-8 en un comentario
  • Nombre de autor/es
  • Contacto de autor/es
  • Licencia del script (Recomiendo GPLv3)
  • Instrucciones
  • Importaciones de scripts o recursos mediante “source”
  • Constantes agrupando las que se relacionan deberán existir las siguientes:
    • VERSION → La versión actual del script con el formato “versión.revisión.parche” empezando por versión “0” mientras esté en desarrollo y constantes modificaciones.
    • WORKSCRIPT → Su valor será el directorio principal del script.
    • USER → Usuario
  • Variables agrupando las que se relacionan
  • Funciones
  • Órdenes y funcionamiento del programa
  • Salida correcta

Decisiones en general

  • Cuando sea necesario ejecutar una consola/terminal/intérprete nunca se usará enlaces como “sh” ya que puede apuntar a otro intérprete de órdenes distinto a bash (Esta guía de estilos es para bash).
  • Evitar el uso de herramientas externas a bash siempre que sea posible.
  • Usar comillas dobles solo cuando se necesite expandir una variable.
  • Usar comillas simples en todo momento que sea posible y no haya que expandir variables.
  • Nunca usar eval en el propio script ya que existen otras formas en el lenguaje
  • En comandos/órdenes que puedan fallar controlar errores como por ejemplo cd /some/path || exit
  • La codificación tiene que ser UTF-8

Espacios en vez de tabulaciones

  • Usar 4 espacios y nunca usar tabulaciones.

Comentarios

  • El código para deshabilitarlo tendrá solo 1 símbolo “#”
  • Los comentarios como tal tendrán dos símbolos “##” y estarán separados por un espacio desde carácter para comentar “#“.
  • Los comentarios en línea, es decir, detrás de código en la misma línea tendrá dos espacios de separación desde el código, luego dos “##” otro espacio y el comentario.
  • Los comentarios en línea de código o variables relacionados pueden tener más de dos espacios para quedar igualados en altura.
    1. ## Este comentario describe lo que realiza la siguiente variable
    2. #variable='Variable Comentada' ## Comentario en la misma línea
    3. #variable2='Comentario' ## Otro comentario relacionado
    4. variable3='Comentario' ## Este también

Limitación de columnas

  • No exceder de los 80 carácteres cada línea.

Espacios entre filas

  • No introducir 2 líneas vacías seguidas, es decir, no más de 1 línea en blanco entre bloque, instrucción, declaración o cualquier otro elemento
  • Detrás de cada bloque habrá una línea en blanco
  • Si se declaran variables o constantes globales solo habrá nuevas líneas cuando se vaya a separar variables que no se agrupen en relación con las anteriores, es decir, separar bloques de variables que no tengan relación con una línea en blanco de por medio pero solo en el caso que haya muchas variables

Finales de línea

  • No usar punto y coma en finales de línea.
  • El punto y coma “;” se puede usar para separar órdenes, no para terminar una línea.

    1. # MAL:
    2. echo 'Hola mundo';
    3. # BIEN:
    4. echo 'Hola mundo'

Variables

  • Las variables deberán siempre que sea posible pertenecer a un ámbito local
  • Usar la cantidad justa de variables globales
  • Declarar variables globales al principio del script
  • Declarar las constantes globales antes de las varibles, al principio del script
  • No usar let ni readonly para declarar variables
  • Todas las variables deberán ir encerradas entre comillas dobles cuando se llamen incorporadas a un comando.
  • Variables dentro de una condición a comprobar [[ -d $variable ]] no se encierran entre comillas

    1. # Variable Global
    2. i='foo'
    3. # Variable local
    4. local i='foo'
    5. # Llamar a la variable
    6. echo "La variable vale $i"
    7. echo "$i"
    8. # Variable como condición a comprobar
    9. if [[ -n $foo ]]; then ## No es necesario encerrar entre comillas
    10. echo "$foo" ## Es necesario encerrarlas entre comillas
    11. # Asignación a otra variable
    12. j=$foo ## Tampoco es necesario encerrarla entre comillas

Inicialización de variables

  • Para iniciar variables sin saber aún que valor van a tomar usaremos los valores más pequeños (vacío, 0)
    1. my_input='' # Cadena vacía, tipo String
    2. my_array=() # Array vacío
    3. my_number=0 # Número vacío, tipo Integer
    4. my_float=0.0 # Número vacío, tipo Float

Constantes

  • Las constantes se declaran en mayúsculas
  • Siempre deberán ser declaradas al principio del script, justo antes que las variables
  • La sintaxis de una constante será la misma que para una variable y su diferencia será el uso

Condiciones y comprobaciones que devuelven boolean

  • Se han de encerrar siempre en dobles corchentes “[[ test ]]”
  • Debe existir un espacio entre la comprobación y el corchete “[[ -d dir ]]”
  • No usar en ningún momento solo 1 corchete “[ test ]” ← MAL

    1. # MAL :
    2. if [ -d directorio ]; then
    3. ...
    4. fi
    5. # BIEN:
    6. if [[ -d directorio ]]; then
    7. ...
    8. fi

Funciones

  • Las funciones no llevarán la palabra reservada function
  • En todo momento se ha de procurar usar variables locales.
  • Las variables globales se usarán lo menos posible.
  • El nombre de la función será camelCase, el cual empieza en minúsculas y cada palabra será capitalizada.
  • El nombre de la función tiene que ser lo más descriptivo posible.
  • El nombre de la función no puede ser igual que una variable, constante o comando.
  • Una función no puede generar efectos colaterales y retornar (Una cosa u otra).

    1. # MAL:
    2. function foo {
    3. i=foo # Variable declarada como global
    4. }
    5. # BIEN:
    6. foo() {
    7. local i=foo # Variable local a la función (preferible)
    8. }

Declaraciones de bloque

  • Las declaraciones de bloque separarán mediante “;” el delimitador de bloque correspondiente (then, do…)

    1. # MAL :
    2. if true
    3. then
    4. ...
    5. fi
    6. true && {
    7. ...
    8. }
    9. # BIEN:
    10. # Condicional if
    11. if true; then
    12. ...
    13. fi
    14. # Bucle while
    15. while true; do
    16. ...
    17. done

Secuencias

  • 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.

    1. # MAL:
    2. for f in $(seq 1 10); do
    3. ...
    4. done
    5. # BIEN:
    6. for f in {1..10}; do
    7. ...
    8. done
    9. for ((i = 0; i < 10; i++)); do
    10. ...
    11. done

Listar sin usar el comando “ls”

  • 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.

    1. # MAL:
    2. for f in $(ls); do
    3. ...
    4. done
    5. # BIEN:
    6. for f in *; do
    7. ...
    8. done

Evitar usar el comando “cat” cuando no sea necesario

  1. # MAL:
  2. cat archivo | grep foo
  3. # BIEN:
  4. grep foo < archivo
  5. # Mucho mejor
  6. grep foo archivo

Resultado de comando en variable

  • Para asignar el resultado de un comando a una variable usar siempre $(comando)

    1. # MAL:
    2. foo=`whoami`
    3. # BIEN:
    4. foo=$(whoami)

Arrays

  • Usar arrays en vez de listas de cadenas separadas por espacios, líneas en blanco, tabulaciones…
  • 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.

    1. # MAL:
    2. modulos='modulo1 modulo2 modulo3'
    3. for modulo in $modulos; do
    4. install "$modulo"
    5. done
    6. # BIEN:
    7. modulos=(modulo1 modulo2 modulo3)
    8. for modulo in "${modulos[@]}"; do
    9. install "$modulo"
    10. done
    11. # AÚN MEJOR:
    12. modulos=(modulo1 modulo2 modulo3)
    13. install "${modulos[@]}" # Pasa todos los argumentos del array de una vez

    Declarar bloques con múltiples condiciones o rutas extensas

  • Cuando declaremos un bloque el cual tendrá muchas condiciones, rutas extensas incluso si son muchos parámetros se insertarán en la siguiente línea.
  • Un bucle while llevará cada condición alineada comenzando debajo de la declaración, tendrá un booleano por línea.
  • Un bucle for llevará cada condición en una línea distinta de forma alineada pero terminando con una barra invertida.
  • 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.

    1. # Bucle while con diversas condiciones
    2. while
    3. condición1
    4. condición2
    5. condición3
    6. do
    7. ...
    8. done
    9. # Bucle for con múltiples rutas → Debe llevar barra invertida al final
    10. for x in ruta/a/dir/ \
    11. ruta/a/dir1/ \
    12. ruta/a/dir2/ \
    13. ruta/a/dir3/
    14. do
    15. ...
    16. done
    17. # Condicional if con múltiples condiciones
    18. if ( false |
    19. true ) &&
    20. [[ 2 > 1 ]]
    21. then
    22. echo 'Todo se ha cumplido'
    23. else
    24. echo 'No se ha cumplido algo'
    25. fi