На роботі я часто пишу баш сценарії. Мій керівник запропонував розбити весь сценарій на функції, подібно до наступного прикладу:
#!/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
Чи є якась причина для цього, крім "читабельності", що, на мою думку, могло б бути однаково добре встановленим ще кількома коментарями та деяким інтервалом між рядками?
Чи робить це сценарій більш ефективним (я б насправді очікував протилежне, якщо що-небудь), чи полегшує зміну коду, що перевищує вищезгаданий потенціал читання? Або це насправді лише стилістичні уподобання?
Зауважте, що хоч сценарій не демонструє це добре, порядок виконання функцій у наших фактичних сценаріях, як правило, дуже лінійний - walk_into_bar
залежить від того, що i_am_foo
було зроблено, і do_baz
діє на речі, створені walk_into_bar
- таким чином ми можемо довільно поміняти порядок виконання - це не те, що ми зазвичай робимо. Наприклад, ви не раптом хотіли б поставити declare_variables
за собою walk_into_bar
, що порушило б справи.
Прикладом того, як я написав би описаний вище сценарій, був би:
#!/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
- це забезпечує змінний обсяг , який є неймовірно важливим в будь-якому нетривіальною сценарії.
main()
вгорі і додаюmain "$@"
внизу, щоб викликати це. Це дозволяє спочатку побачити логіку сценарію високого рівня, коли ви відкриваєте її.