1. Resumen
No entiendo, ¿por qué necesito la regla de bashate E010 ?
2. Detalles
Yo uso bashate para .sh
archivos linting . Regla E010:
hacer no en la misma línea que para
for
bashate:
Correcto:
#!/bin/bash for f in bash/*.sh; do sashacommand "$f" done
Error:
#!/bin/bash for f in bash/*.sh do sashacommand "$f" done
¿Hay algún argumento válido, por qué lo necesito for
y do
en la misma línea?
3. No es útil
No puedo encontrar una respuesta a mi pregunta en:
- Artículos sobre las mejores prácticas de codificación ( ejemplo )
documentación de bashate . Encuentro única :
Un conjunto de reglas que ayudan a mantener las cosas consistentes en los bloques de control. Estos se ignoran en las líneas largas que tienen una continuación, porque el desenrollado es algo "interesante"
bash
shell-script
Саша Черных
fuente
fuente
do
es definitivamente un poco inusual, perofor ... \ndo\n<indent>body...
es extremadamente común e incluso estimaría más que esofor ... ; do
. ¿También se queja de eso?bashate
es un corrector de estilo . Los estilos son inherentemente subjetivos. No lo use si no le gusta el estilo artibrary que impone. En su lugar, debe considerar un verificador de sintaxis / error como shellcheck .E010
- Sólo el estilo imperio o en algunos casos que necesito para y hago en la misma línea, no sólo por razones de estilo.do
. Es como sangrar la llave de apertura de unif
y agregar código en esa misma línea en un lenguaje como C. Otro ejemplo, si Python lo permitiera, sería colocar:
unif
sangrado en la siguiente línea y agregar código en esa misma línea. Lo hará diferente con líneas adicionales en el cuerpo.Respuestas:
Sintácticamente, los siguientes dos fragmentos de código son correctos y equivalentes:
Este último podría posiblemente puede decir que sea más difícil de leer como
do
ofusca ligeramente el comando en el cuerpo del bucle. Si el bucle contiene múltiples comandos y el siguiente comando está en una nueva línea, la ofuscación se resaltaría aún más:... pero marcarlo como un "error" es, en mi humilde opinión, la opinión personal de alguien más que una verdad objetiva.
En general, casi cualquiera
;
puede ser reemplazado por una nueva línea. Ambos;
y newline son terminadores de comando.do
es una palabra clave que significa "aquí sigue lo que hay que hacer (en estefor
ciclo)".es lo mismo que
y como
La razón para usar uno sobre otro es la legibilidad y las convenciones de estilo local / personal.
Opinión personal:
En los encabezados de bucle que son muy largos , creo que puede tener sentido colocar
do
una nueva línea, como eno
Lo mismo ocurre con el
then
en unaif
declaración.Pero, de nuevo, esto se reduce a las preferencias personales de estilo, o al estilo de codificación que el equipo / proyecto esté usando.
fuente
do
, no veo una razón por la cual ponerlo en la siguiente línea ayudaría a la legibilidad.do
(othen
) en una línea por sí mismo (como en el penúltimo ejemplo). Todo esto tiene que ver con las preferencias personales. No me gustan las líneas demasiado largas, en parte porque mi terminal tiene "solo" 80 caracteres de ancho, y en parte porque creo que se ve desordenado. También me resulta difícil analizar líneas muy largas en busca de errores.do
en una línea separada un "error". Esas son frases bastante estrictas, por lo que vale la pena señalar que, por el contrario, la llamada "regla" es en realidad solo una opinión subjetiva.Tenga en cuenta lo que dice en la parte superior de la página:
PEP8 es la guía de estilo para el código Python. Si bien la gente de Python a menudo parece tomar muy en serio sus problemas de estilo [cita requerida] , es solo eso, una guía. Podríamos encontrar ventajas tanto para poner la línea
do
en la misma línea comofor
para ponerla en una línea propia.Es la misma discusión sobre dónde poner el
{
en código C al iniciar unif
owhile
bloque (o tal).Algunas líneas a continuación en la documentación, hay otra regla interesante:
Supongo que el punto aquí es que el autor de esa guía de estilo piensa que usar la
function
palabra clave es necesario para que el lector reconozca una declaración de función. Sin embargo,function foo
es una forma no estándar de definir una función: la forma estándar esfoo()
. La única diferencia entre los dos (en Bash) es que el otro es más difícil de transferir a un shell estándar, como/bin/sh
en Debian o Ubuntu.Por lo tanto, sugeriría tomar cualquiera y todas esas guías de estilo con un grano de sal o tres, y decidir por sí mismo cuál es el mejor estilo. Un buen verificador de estilo permite desactivar algunas verificaciones (bashate tiene
bashate -i E010,E011
que ignorar esas dos verificaciones). Un excelente verificador de estilo le permitiría modificar las pruebas, por ejemplo, para verificar lo contrario de E020, aquí.fuente
TL; DR: No es necesario. Es solo la opinión de un tipo.
Como muchos otros, he estado escribiendo
for
bucles como este durante décadas:Este diseño resalta el hecho de que
do ... done
rodea el cuerpo del bucle, como las llaves en lenguajes tipo C, y permite que las nuevas líneas separen los componentes de la construcción del bucle.Por supuesto, también hay guerras religiosas sobre dónde colocar las llaves, por lo que podría decirse que el jurado aún no se ha pronunciado sobre esto. En mi humilde opinión, así es claramente cómo fue diseñado para funcionar; Bourne era aficionado a los delimitadores emparejados, cf.
if ... fi
,case ... esac
y la necesidad de un punto y coma en la versión más corta revela que lo estás haciendo más corto de lo originalmente diseñado. Nada de malo con eso; los avances tecnológicos y muchas cosas que antes parecían una buena idea ahora están mal vistas, comogoto
. Pero hasta que toda la comunidad de scripting de shell adopte las preferencias de losbashate
autores, no tiene que hacer nada.fuente
fi
que corresponde aif
, yesac
etc. proviene de Algol 68. La única razón por la que unfor
ciclodo
no terminaod
es eseod
es el nombre de una utilidad estándar existente. Ver en.wikipedia.org/wiki/ALGOL_68C#Algol_68C_and_Unixbegin ... end
etc.).od
, eso es gracioso ... (Aunque, ¿por qué no terminar con buclesrof
, entonces?)BEGIN
yEND
se definen allí también.FOR
yDO
también estaría en líneas separadas, por convención, excepto cuando todo el ciclo encajaría fácilmente en una sola línea.Me sorprende que nadie haya mencionado aún esta sintaxis válida y portátil:
Observe cuidadosamente que
for
ydo
están en la misma línea, sin punto y coma. Resultado:fuente
for q
ydo
son en líneas separadas (la forma en este ejemplo fue hace un par de décadas sin apoyo en la cáscara Almquish originales (ash
): in-ulm.de/~mascheck/various/ bourne_args / # endnote )Varias buenas respuestas aquí. Siempre tome las guías de estilo con un grano de sal, y en mi humilde opinión y experiencia, preocúpese de una manera moderada a moderada por cualquier comunidad que esté plagada de un dogma excesivo cuando se trata de estilo. Es casi como si creyeran que cuando FINALMENTE obtienen ese último punto, y ese último T cruzado, entonces el software funcionará. A veces se necesita un estilo más que perfecto para eliminar errores ...
Cuando comencé a aprender shell, la mayoría de los scripts y tutes usaban el formato de punto y coma en línea
pero como no tenía experiencia, me costó un poco detectar el; y do, ambos esenciales para confirmar la corrección sintáctica. Así que preferí hacer en la siguiente línea por sí solo. Ya no hago eso (juego de palabras)
Además, el comando 'while' es un excelente candidato para un pequeño y agradable truco:
pero cuando los comandos de preparación son un poco voluminosos y / o la condición es compleja, se formatea mejor como
y luego agregar el do como "; do" es positivamente fugitivo.
Incluso puedes ser más intenso que eso:
porque cada enunciado es una expresión. Observe cómo ambos estilos se usan de manera oportunista. Mantenlo limpio y es bastante legible. Compacta o contorsiona en nombre del estilo o "ahorro de espacio" y se convierte en un horrible desastre.
¡Asi que! Teniendo en cuenta los estilos más bien barrocos de los guiones de shell en general, cualquier cosa destinada a aumentar la claridad y el fácil acceso visual a símbolos significativos siempre es algo bueno.
La forma en que 'do' se escribe en línea con el comando es agradable cuando tienes un pequeño comando: no encuentro el 'do' visualmente oculto, ni el comando interno está realmente oscurecido:
Me parece bastante agradable de ver, y tiene análogos con while, if y case:
La claridad y el orden general es todo lo que Codd * te pide.
* Edgar F. Codd, padre de la teoría de bases de datos relacionales.
fuente
while
con unaif
condición antes. ¡Guay!