W pracy często piszę skrypty bash. Mój przełożony zasugerował, aby cały skrypt był podzielony na funkcje, podobnie jak w poniższym przykładzie:
#!/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
Czy istnieje jakiś inny powód, niż „czytelność”, który moim zdaniem mógłby być równie dobrze ustalony z kilkoma dodatkowymi komentarzami i pewnymi odstępami między wierszami?
Czy sprawia, że skrypt działa wydajniej (w rzeczywistości spodziewałbym się czegoś przeciwnego), czy też ułatwia modyfikację kodu poza wyżej wymienionym potencjałem czytelności? Czy to naprawdę tylko preferencje stylistyczne?
Należy pamiętać, że chociaż skrypt nie pokazuje tego dobrze, „kolejność uruchamiania” funkcji w naszych rzeczywistych skryptach jest zwykle bardzo liniowa - walk_into_bar
zależy od rzeczy, które i_am_foo
zostały wykonane, i do_baz
działa na podstawie rzeczy skonfigurowanych przez walk_into_bar
- tak więc możliwość arbitralnej zamiany kolejności uruchamiania nie jest czymś, co ogólnie robilibyśmy. Na przykład, nie będzie nagle chcesz umieścić declare_variables
po walk_into_bar
, to by złamać rzeczy.
Przykładem tego, jak napisałbym powyższy skrypt, jest:
#!/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
- zapewnia to zakres zmiennych, co jest niezwykle ważne w każdym nietrywialnym skrypcie.
main()
na górze i dodajęmain "$@"
na dole, aby to nazwać. Dzięki temu zobaczysz logikę skryptów wysokiego poziomu po jej otwarciu.