シェルスクリプトによる関数の複雑さの詳細–パートVII
「シェルスクリプトでの関数の理解と記述」に関する以前の記事では、シェルスクリプトで関数を記述する方法についての基本的な考え方を説明したかもしれません。次に、ローカル変数の使用や再帰などの機能機能について詳しく説明します。
ローカル変数
変数をローカルにするものは何ですか?変数が宣言されている特定のブロックによって異なります。 ローカルとして宣言された変数 表示されるコードのブロックからアクセスできます。つまり、スコープはローカルです。このことを説明するために、以下の1つの例を見てみましょう。
#!/bin/bash func( ) { local i=10 j=20 echo "i from func = $i" echo "j from func = $j" } echo "i outside func = $i" echo "j outside func = $j" func echo "i outside func = $i" echo "j outside func = $j" exit 0
上記のスクリプトを実行すると、出力は次のようになります。
i outside func = j outside func = i from func = 10 j from func = 20 i outside func = j outside func = 20
これは、関数 func 最初の2の間、まだ電話をかけていません エコーステートメントが実行されました。関数funcを呼び出した後 同じ2つのエコーステートメント 別の結果を生成します。ここで、変数 j 、 func内で宣言されました ローカルではなく、後でアクセスできます。
したがって、 jの値 20になります 。ローカル変数iはどうですか ?そのスコープは関数func内にあったため 、値 10 外部からアクセスできませんでした。変数jに注意してください 通常、 func内で宣言されます デフォルトではグローバルです。
これで、ローカル変数と、関数ブロック内でのローカル変数の使用方法に精通しました。関数の下で最も興味深いセクションである再帰に移りましょう。
再帰とは何ですか?
それ自体を呼び出す関数は、一般に再帰プロシージャと呼ばれます。または、同じアルゴリズムのより単純なバージョンを使用してアルゴリズムを表現するものとして定義することもできます。数の階乗を見つける例を考えてみましょう。 n! =1 x 2 x 3 x…x(n-1)x n 。したがって、漸化式は次のように記述できます。
n! = (n-1)! x n
したがって、同じ関数を再帰的に呼び出し、各呼び出しからの戻り値を使用して前の結果を乗算するのは簡単です。つまり、
5! = 4! x 5 4! = 3! x 4 3! = 2! x 3 2! = 1! x 2 1! = 0! x 1
ローカル変数を使用した再帰
ここでは、ローカル変数と再帰を使用して数値の階乗を見つけるためのスクリプトを作成しようとします。
#!/bin/bash fact( ) { local num=$1 if [ $num -eq 0 ]; then ret=1 else temp=$((num-1)) fact $temp ret=$((num*$?)) fi return $ret } fact 5 echo "Factorial of 5 = $?" exit 0
num 各n-1を格納するために使用されるローカル変数です 各呼び出しの値。ここで、基本条件は、数値がゼロに等しいかどうかをチェックします(0!=1であり、負の数値に対して階乗が定義されていないため)。この基本条件に到達すると、値 1を返します。 その発信者に。今num=1 およびret=1 x 1 。
この瞬間、 1を返します その発信者に。今num=2 およびret=2 x 1 等々。最後に、 num =5の場合 戻り値は24になります 最終結果はret=5 x 24 。最終結果120 最初の呼び出し元ステートメントに渡されて表示されます。
上記のスクリプトには1つの問題があります。前回の記事で説明したように、関数は大きな整数を返すことはできません。したがって、上記の問題の解決策を見つけるのはユーザーに任されています。
Q。 ローカル変数を使用せずに再帰を実行できますか?答えははいです 。
ローカル変数なしの再帰
フィボナッチ数列を表示するには、次の例をご覧ください。 再帰を使用します。基本的な漸化式は次のとおりです。
fib(0) = 0 fib(1) = 1 else fib(n) = fib(n-1) + fib(n-2) Fibonacci series using recursion #!/bin/bash fib( ) { a=$1 if [ $a -lt 2 ]; then echo $a else ((--a)) b=$(fib $a) ((--a)) c=$(fib $a) echo $((b+c)) fi } for i in $(seq 0 15) do out=$(fib $i) echo $out done exit 0
上記のスクリプトでは、ローカル変数は使用されていません。実行中のスクリプトの流れを理解していただければ幸いです。
ここでは、値 15 フィボナッチ数列の用語数を表します 表示されます。上記のスクリプトの実行に関して何か特別なことに気づきましたか。少し時間がかかりますね。スクリプトでの再帰は、 Cなどのプログラミング言語での再帰よりも遅くなります。 。
この記事では、シェルスクリプトの関数の部分を締めくくる予定です。 テクミントで最新情報を入手してください アレイに関する今後の記事を掲載する その他…
-
6 つの実用的な例を含む Bash シェル関数のチュートリアル
Bash シェル関数は、グループに単一の名前を使用して、後で実行するために複数の UNIX / Linux コマンドをグループ化する方法です。 . Bash シェル関数は、通常の Unix コマンドと同じように実行できます。シェル関数は、それらを解釈するための新しいプロセスを作成することなく、現在のシェル コンテキストで実行されます。bash エイリアスと関数の両方を使用すると、より長い、またはより複雑なコマンドのショートカットを定義できます。ただし、エイリアスは、このチュートリアルで説明されているように、これらの関数が許可する制御フロー、引数、およびその他の巧妙なものを許可しません。 この
-
5 つの実用的な例を含む Bash スクリプト入門チュートリアル
進行中の Unix Sed および Unix Awk シリーズと同様に、Bash スクリプトに関するいくつかの記事を投稿します。実用的な例ですべての bash スクリプト テクニックをカバーします。 シェルは、ユーザー コマンドを解釈するプログラムです。コマンドは、ユーザーが直接入力するか、シェル スクリプトと呼ばれるファイルから読み取るかのいずれかです。ユーザーからの入力を直接読み取る場合、シェルは対話型シェルとして呼び出されます。 シェルは、ファイルからコマンドを読み取って実行するときに、非対話型シェルとして呼び出されます。この場合、シェルはスクリプト ファイルの各行を上から下に読み取