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'
Este es un script típico de una línea de Bash que usa los comandossleep
,fg
,echo
ysed
así 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 elsleep
comando colocado en segundo plano de nuevo en primer plano, y espere a que termine como procesos normales que no están en segundo plano) parawait
que esperará el PID del sueño (iniciado poreval
y 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
¡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') "
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 world
fue 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")")"
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!