Bei der Arbeit schreibe ich häufig Bash-Skripte. Mein Vorgesetzter hat vorgeschlagen, das gesamte Skript in Funktionen zu unterteilen, ähnlich dem folgenden Beispiel:
#!/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
Gibt es einen anderen Grund, als die "Lesbarkeit", die meiner Meinung nach mit ein paar weiteren Kommentaren und einigem Zeilenabstand gleich gut festgestellt werden könnte?
Lässt sich das Skript effizienter ausführen (ich würde eigentlich eher das Gegenteil erwarten) oder ist es einfacher, den Code über das oben genannte Lesbarkeitspotential hinaus zu ändern? Oder ist es wirklich nur eine stilistische Präferenz?
Bitte beachten Sie, dass , obwohl das Skript nicht gut funktioniert zeigen, die „run Ordnung“ der Funktionen in unserem aktuellen Skripte sehr linear zu sein scheint - walk_into_bar
abhängig von Sachen , die i_am_foo
getan hat, und do_baz
wirkt auf Material eingesetzt durch walk_into_bar
- so seinen Die Laufreihenfolge willkürlich tauschen zu können, ist etwas, was wir normalerweise tun würden. Zum Beispiel, würden Sie nicht plötzlich setzen wollen declare_variables
nach walk_into_bar
, dass sich die Dinge brechen.
Ein Beispiel, wie ich das obige Skript schreiben würde, wäre:
#!/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
- bietet diese Variable Umfang , die in jedem nicht-trivialen Skript unglaublich wichtig ist.
main()
oben undmain "$@"
unten, um es aufzurufen. Auf diese Weise können Sie die übergeordnete Skriptlogik als Erstes anzeigen, wenn Sie sie öffnen.