Au travail, j'écris fréquemment des scripts bash. Mon superviseur a suggéré que le script entier soit divisé en fonctions, comme dans l'exemple suivant:
#!/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
Y a-t-il une raison de faire cela autre que la "lisibilité", qui, à mon avis, pourrait être tout aussi bien établie avec quelques commentaires supplémentaires et un espacement des lignes?
Cela rend-il le script plus efficace (je pense en réalité le contraire), ou facilite-t-il la modification du code au-delà du potentiel de lisibilité susmentionné? Ou est-ce vraiment juste une préférence stylistique?
Veuillez noter que, bien que le script ne le montre pas bien, "l'ordre d'exécution" des fonctions de nos scripts actuels tend à être très linéaire: cela walk_into_bar
dépend des choses que vous avez i_am_foo
faites et do_baz
agit walk_into_bar
comme pouvoir échanger arbitrairement l'ordre d'exécution n'est généralement pas ce que nous ferions. Par exemple, vous ne voudriez pas soudainement mettre declare_variables
après walk_into_bar
, cela casserait les choses.
Voici un exemple d'écriture du script ci-dessus:
#!/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
- ceci fournit une étendue de variable extrêmement importante pour tout script non trivial.
main()
en haut et ajoutermain "$@"
en bas pour l'appeler. Cela vous permet de voir la logique de script de haut niveau en tout temps lorsque vous l'ouvrez.