職場では、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
ベストアンサー1
読みやすさそれは同じです。しかし、もっとたくさんあります。モジュラーそれだけではない。 (半モジュール式おそらく機能により正確です。 )
関数内の一部の変数をローカル変数として保持することで増加できます。信頼できる、物事が汚れる可能性を減らします。
関数のもう一つの利点は再利用性。関数がコーディングされると、スクリプトで複数回適用できます。他のスクリプトに移植することもできます。
あなたのコードは現在直線的である可能性がありますが、将来は線形領域に移動する可能性があります。マルチスレッドまたは多重処理バッシュの世界で。関数で作業する方法を学んだら、並列処理に進む準備が整いました。
もう1つ追加することがあります。 Etsitpab Niolivが以下の説明に示すように、機能から一貫したエンティティにリダイレクトするのは簡単です。ただし、機能リダイレクトには別の側面があります。つまり、関数定義に従ってリダイレクトを設定できます。例えば。 :
f () { echo something; } > log
これで、関数呼び出しに明示的なリダイレクトは必要ありません。
$ f
これにより、重複を避けることができ、安定性が向上し、整理された内容を維持するのに役立ちます。
また、見ることができます