Conceptos básicos de automatización y secuencias de comandos de Bash (parte 2)

Bash es un lenguaje de codificación y shell ideal, que le permite crear scripts de automatización de alta gama. En esta segunda parte de la serie, veremos la densidad de codificación, los comentarios en línea y las comillas de variables correctas usando comillas simples o dobles.

Conceptos básicos de automatización y secuencias de comandos de Bash

Si aún no lo ha hecho y recién está comenzando en Bash, lea nuestro artículo Bash Automation and Scripting Basics Part 1. Este es el segundo artículo de nuestra serie de tres partes sobre la automatización de Bash y los conceptos básicos de secuencias de comandos. En el artículo de hoy, veremos, entre otros temas, la densidad de codificación de Bash y su conexión con la preferencia del desarrollador. También veremos los comentarios en línea en relación con esto.

Una vez que comenzamos a crear pequeños scripts, explorar variables y trabajar con cadenas de texto, rápidamente nos damos cuenta de que puede haber una diferencia conceptual entre comillas simples y dobles. La hay, y en el segundo tema a continuación nos sumergiremos en esto.

Densidad y concisión de codificación Bash

El lenguaje de codificación Bash puede ser muy denso y conciso, pero también puede ser espacioso y detallado. Depende en gran medida de la preferencia del desarrollador.

Para exampleel siguiente código Bash:

true || echo 'untrue'

Que se puede leer como No hacer nada, y hacerlo con éxito (código de salida 0), y si eso falla (puede leer el modismo Bash||como OR) genera el texto ‘falso’, también se puede escribir como:

if [ ! true ]; then
  echo 'untrue'
fi

Lo que hace que el código sea un poco diferente, pero básicamente hace lo mismo.

Esto a su vez puede leerse como Si no es cierto (indicado por el!modismo) verdadero, luego muestra el texto ‘falso’.

Ambos miniguiones dan como resultado la misma salida vacía, ya que verdadero no es falso.

La multitud de comandos y herramientas disponibles (o instalables) desde y en la línea de comando magnifican aún más la posible compensación entre scripts altamente legibles y código difícil de entender, denso y conciso.

Mientras que los ejemplos anteriores son breves y relativamente fáciles de entender, cuando crea una sola línea larga (un término que se usa a menudo entre los desarrolladores de Bash para indicar una pieza de código, que consta de varios comandos, escritos en una sola línea) empleando muchos de esos comandos , en lugar de poner lo mismo en un guión más detallado, la diferencia se vuelve más clara. Considerar:

V="$(sleep 2 & fg; echo -n '1' | sed 's|[0-9]|a|')" && echo "${V}" | sed 's|[a-z]|2|g' || echo 'fail'

Un oneliner complejo example

Este es un script típico de una línea de Bash que usa los comandossleep,fg,echoysedasí como varios modismos de Bash y expresiones regulares para dormir básicamente 2 segundos, generar texto y transformar este texto mediante el uso de expresiones regulares. El script también verifica regularmente las condiciones/resultados de los comandos anteriores usando los modismos de Bash||(si no tiene éxito, haga lo siguiente) y&&(si tiene éxito, haga lo siguiente)

Traduje esto, con funcionalidad de coincidencia aproximada, a un script más completo, con algunas modificaciones. Para example intercambiamos nuestrofg(traer elsleepcomando colocado en segundo plano de nuevo en primer plano, y espere a que termine como procesos normales que no están en segundo plano) parawaitque esperará el PID del sueño (iniciado porevaly capturado usando el lenguaje Bash$!) para terminar.

#!/bin/bash

CMD="sleep 2"
eval ${CMD} &
wait $!
EXIT_CODE=${?}

V="$(echo -e "${CMD}n1" | sed 's|[0-9]|a|')"

if [ ${EXIT_CODE} -eq 0 ]; then
  echo "${V}" | sed 's|[a-z]|2|g'
  EXIT_CODE=${?}
  if [ ${EXIT_CODE} -ne 0 ]; then
    echo 'fail'
  fi
fi

La misma línea compleja en un guión completo en su lugar

¡Menuda diferencia! Y este es solo un desarrollador que lo escribe a su manera. El código Bash escrito por otros tiende a ser algo difícil de leer, y tal dificultad aumenta rápidamente con la densidad y la brevedad. Aún así, un desarrollador de nivel experto en Bash comprenderá rápidamente incluso el código muy denso y conciso escrito por otros, con algunas excepciones, para example expresiones regulares.

Para obtener más información sobre cómo escribir expresiones regulares, consulte Cómo modificar texto usando expresiones regulares con el editor de secuencias sed.

A partir de estos ejemplos, está claro que su millaje variará con el tiempo. Sin embargo, en general, se recomienda la amistad entre pares del codificador (escribiendo un código altamente legible) cada vez que comience a desarrollar scripts de Bash.

Si tiene que crear un código denso y conciso, puede proporcionar muchos comentarios en línea. Una línea precedida por un#se considera una línea de comentario/observación, y el símbolo#incluso se puede usar hacia el final de una línea después de cualquier comando ejecutable, para publicar un comentario de sufijo que explique el comando, la declaración condicional, etc. Para example:

# This code will sleep one second, twice
sleep 1  # First sleep
sleep 1  # Second sleep

¿Comillas simples o comillas dobles?

En Bash, texto entre comillas simples (') son tomados como texto literal por el intérprete de Bash, mientras que el texto entre comillas dobles (") es interpretado (analizado) por el intérprete de Bash. Mientras que la diferencia en cómo funcionan las cosas puede no quedar clara de inmediato a partir de esta definición, la siguiente example nos muestra lo que sucede cuando intercambiamos'para"y viceversa:

echo ' $(echo "Hello world") '
echo " $(echo 'Hello world') "

Comillas simples versus comillas dobles en Bash en un hola mundo example

En el primero exampleel texto $(echo "Hello world") se ve como texto literal, por lo que la salida es simplemente $(echo "Hello world") . Para el segundo example sin embargo, la salida es Hello world .

El intérprete de Bash analizó el texto entre comillas dobles para ver si encontraba algún modismo de Bash especial para actuar. Uno de esos modismos se encontró en$( ... )que básicamente inicia una subcapa y ejecuta lo que esté presente entre la( ... )modismos. Piense en ello como un shell dentro de un shell, un subshell, que ejecuta todo lo que le pasa como un comando completamente nuevo. La salida de cualquiera de estos comandos se devuelve al shell de nivel superior y se inserta en el lugar exacto donde se inició el subshell.

Por lo tanto, nuestro subshell ejecutóecho 'Hello world'de los cuales la salida esHello world. Una vez hecho esto, la subcapa terminó y el textoHello worldfue insertado en lugar del$( ... )invocación de subshell (piense en ello como todos los$( ... )el código está siendo reemplazado por cualquier salida que haya generado la subcapa.

El resultado, para el caparazón superior, es el siguiente comando:echo " Hello world "cuya salida es Hello world como vimos.

Tenga en cuenta que cambiamos las comillas dobles dentro de la subcapa a comillas simples. ¡Esto no es necesario! Uno esperaría ver un error de análisis cuando un comando toma la sintaxis deecho " ... " ... " ... ", en el sentido de que las segundas comillas dobles terminarían con la primera, seguidas de más pruebas y, por lo tanto, conducirían a un error. Sin embargo, este no es el caso.

Y esto no se debe a que Bash sea flexible con las cadenas entre comillas múltiples (aceptaecho 'test'"More test"'test'bastante feliz por example), sino porque la subcapa es una capa en sí misma y, por lo tanto, se pueden usar comillas dobles, nuevamente, dentro de la subcapa. Vamos a probar esto con un adicional example:

echo "$(echo "$(echo "more double quotes")")"

Bash acepta fácilmente comillas dobles repetidas dentro de una subcapa

Esto funcionará bien y producirá la salida.more double quotes. Las dos subcapas anidadas (que se ejecutan dentro de la capa principal desde la que está ejecutando esto) aceptan cada una comillas dobles y no se generan errores, incluso si se anidan varias comillas dobles en el comando general de una sola línea. Esto muestra parte del poder de programación de Bash.

En resumen

Habiendo explorado la densidad de codificación, nos damos cuenta del valor de escribir código altamente legible. No obstante, si tenemos que crear un código denso y conciso, podemos agregar muchos comentarios en línea usando#para ayudar a la legibilidad. Observamos las comillas simples y dobles y cómo su funcionalidad difiere sustancialmente.

También analizamos brevemente los comentarios en línea en los scripts, así como la funcionalidad de la subcapa cuando se ejecuta desde una cadena entre comillas dobles. Finalmente, vimos cómo una subcapa puede usar otro conjunto de comillas dobles sin afectar de ninguna manera las comillas dobles utilizadas en un nivel superior.

En Bash Automation and Scripting Basics (Parte 3) analizamos la depuración de scripts y más.¡disfrutar!

Actualizaciones del boletín

Ingrese su dirección de correo electrónico a continuación para suscribirse a nuestro boletín