完全なbashスクリプトを関数として書くのはなぜですか?

完全なbashスクリプトを関数として書くのはなぜですか?

職場では、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_foodo_bazwalk_into_bardeclare_variableswalk_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

これにより、重複を避けることができ、安定性が向上し、整理された内容を維持するのに役立ちます。

また、見ることができます

おすすめ記事