No trabalho, escrevo scripts bash com frequência. Meu supervisor sugeriu que o script inteiro fosse dividido em funções, semelhante ao seguinte exemplo:
#!/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
Existe alguma razão para fazer isso além da "legibilidade", que eu acho que poderia estar igualmente bem estabelecida com mais alguns comentários e espaçamento entre linhas?
Isso faz com que o script seja executado com mais eficiência (eu realmente esperaria o oposto, se houver) ou facilita a modificação do código além do potencial de legibilidade acima mencionado? Ou é realmente apenas uma preferência estilística?
Observe que, embora o script não o demonstre bem, a "ordem de execução" das funções em nossos scripts reais tende a ser muito linear - walk_into_bar
depende do que i_am_foo
foi feito e do_baz
atua no que foi configurado walk_into_bar
- A capacidade de trocar arbitrariamente a ordem de execução não é algo que geralmente estaríamos fazendo. Por exemplo, você não iria de repente querem colocar declare_variables
depois walk_into_bar
, que iria quebrar as coisas.
Um exemplo de como eu escreveria o script acima seria:
#!/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
- isso fornece um escopo variável que é incrivelmente importante em qualquer script não trivial.
main()
na parte superior e adicionomain "$@"
na parte inferior para chamá-lo. Isso permite que você veja a lógica do script de alto nível quando você a abre.