En el trabajo, escribo scripts de bash con frecuencia. Mi supervisor ha sugerido que todo el script se divida en funciones, similar al siguiente ejemplo:
#!/bin/bash
# Configure variables
declare_variables() {
noun=geese
count=three
}
# Announce something
i_am_foo() {
echo "I am foo"
sleep 0.5
echo "hear me roar!"
}
# Tell a joke
walk_into_bar() {
echo "So these ${count} ${noun} walk into a bar..."
}
# Emulate a pendulum clock for a bit
do_baz() {
for i in {1..6}; do
expr $i % 2 >/dev/null && echo "tick" || echo "tock"
sleep 1
done
}
# Establish run order
main() {
declare_variables
i_am_foo
walk_into_bar
do_baz
}
main
¿Hay alguna razón para hacer esto además de la "legibilidad", que creo que podría estar igualmente bien establecida con algunos comentarios más y un poco de espacio entre líneas?
¿Hace que el script se ejecute de manera más eficiente (en realidad esperaría lo contrario, si es que lo hace), o hace que sea más fácil modificar el código más allá del potencial de legibilidad antes mencionado? ¿O es realmente solo una preferencia estilística?
Tenga en cuenta que, aunque el guión no lo demuestra así, el "orden de ejecución" de las funciones en nuestros scripts actuales tiende a ser muy lineal - walk_into_bar
depende de las cosas que i_am_foo
ha hecho, y do_baz
actúa sobre la materia creada por walk_into_bar
- así que estar poder intercambiar arbitrariamente el orden de ejecución no es algo que generalmente estaríamos haciendo. Por ejemplo, de repente no querrás poner declare_variables
después walk_into_bar
, eso rompería las cosas.
Un ejemplo de cómo escribiría el script anterior sería:
#!/bin/bash
# Configure variables
noun=geese
count=three
# Announce something
echo "I am foo"
sleep 0.5
echo "hear me roar!"
# Tell a joke
echo "So these ${count} ${noun} walk into a bar..."
# Emulate a pendulum clock for a bit
for i in {1..6}; do
expr $i % 2 >/dev/null && echo "tick" || echo "tock"
sleep 1
done
local
: esto proporciona un alcance variable que es increíblemente importante en cualquier script no trivial.
main()
en la parte superior y agregomain "$@"
en la parte inferior para llamarlo. Eso le permite ver la lógica del script de alto nivel primero cuando la abre.