在工作中,我经常编写bash脚本。我的主管建议将整个脚本分解为功能,类似于以下示例:
#!/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 "$@"
在底部添加以进行调用。这使您在打开高级脚本逻辑时首先看到它。