Al lavoro, scrivo spesso script di bash. Il mio supervisore ha suggerito che l'intero script sia suddiviso in funzioni, simile al seguente esempio:
#!/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
C'è qualche motivo per farlo oltre alla "leggibilità", che penso possa essere ugualmente ben stabilita con qualche commento in più e qualche interlinea?
Rende l'esecuzione dello script più efficiente (in realtà mi aspetterei il contrario, se non altro) o semplifica la modifica del codice oltre il suddetto potenziale di leggibilità? O è davvero solo una preferenza stilistica?
Si noti che sebbene lo script non lo dimostri bene, l '"ordine di esecuzione" delle funzioni nei nostri script effettivi tende ad essere molto lineare - walk_into_bar
dipende dalle cose che i_am_foo
ha fatto e do_baz
agisce sulle cose impostate da walk_into_bar
- così essendo in grado di scambiare arbitrariamente l'ordine di esecuzione non è qualcosa che faremmo generalmente. Per esempio, non si improvvisamente voglia di mettere declare_variables
dopo walk_into_bar
, che rompere le cose.
Un esempio di come scriverei lo script sopra sarebbe:
#!/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
- questo fornisce un ambito variabile che è incredibilmente importante in qualsiasi script non banale.
main()
in alto e aggiungomain "$@"
in fondo per chiamarlo. Ciò ti consente di vedere la logica dello script di alto livello per prima cosa quando la apri.