シェルスクリプトの関数の理解と記述–パートVI
関数は、あらゆるプログラミング言語で重要な役割を果たします。多くの実際のプログラミング言語と同様に、bashには限られた実装で使用される関数があります。
関数とは何ですか?
プログラミングでは、関数は特定のタスクを実行するプログラムの名前付きセクションです。この意味で、関数は一種のプロシージャまたはルーチンです。関数が呼び出されると、プログラムはコードの現在のセクションを離れ、関数内の最初の行の実行を開始します。コードが繰り返される場合やタスクが繰り返される場合は、代わりに関数の使用を検討してください。
たとえば、特定のプログラムのいくつかの段階で数値の階乗を見つける必要がある場合を考えてみます。毎回(階乗を計算するための)コード全体を記述する代わりに、ブロック内で階乗を計算するコードの部分を記述し、同じものを複数回再利用することができます。
なぜ関数を書くのですか?
- コードを再利用するのに役立ちます。
- プログラムの読みやすさを向上させます。
- プログラム内での変数の効率的な使用。
- プログラムを部分的にテストできます。
- プログラムを一連のサブステップとして表示します。
シェルスクリプトの関数
シェルスクリプトで関数を記述するための一般的な構文には、次の方法があります。
function func_name { . . . commands . . . } or func_name ( ) { . . . commands . . . } Opening curly braces can also be used in the second line as well. func_name ( ) { . . . commands . . . }
シェルスクリプトで通常行うように、これらの関数ブロック内に有効なコマンドをいつでも自由に書き込むことができます。それでは、小さな関数を内部に持つ1つの簡単なスクリプトを書いてみましょう。
#!/bin/bash call_echo ( ) { echo ‘This is inside function’ } op=$1 if [ $# -ne 1 ]; then echo "Usage: $0 <1/0>" else if [ $1 = 0 ] ; then echo ‘This is outside function’ elif [ $1 = 1 ] ; then call_echo else echo ‘Invalid argument’ fi fi exit 0
関数定義は、最初の呼び出しの前に置く必要があります。関数を呼び出す前に「関数を宣言する」ことに勝るものはありません。また、関数はいつでも関数内にネストできます。
同じ関数が複数回定義されている場合、最終バージョンが呼び出されます。例を見てみましょう。
#!/bin/bash func_same ( ) { echo ‘First definition’ } func_same ( ) { echo ‘Second definition’ } func_same exit 0
パラメータを取り、値を返す関数
パラメータを取り、値を返す関数を検討して、さらに深く掘り下げましょう。関数から値を返すには、組み込みの「return」シェルを使用します。構文は次のとおりです。
func_name ( ) { . . . commands . . . return $ret_val }
同様に、以下に示すように、スペースで区切られた関数に引数を渡すことができます。
func_name $arg_1 $arg_2 $arg_3
関数内では、$ 1、$ 2、$3などの順序で引数にアクセスできます。次のスクリプト例を見て、関数を使用して最大2つの整数を見つけ、より明確にします。
#!/bin/bash USG_ERR=7 max_two ( ) { if [ "$1" -eq "$2" ] ; then echo 'Equal' exit 0 elif [ "$1" -gt "$2" ] ; then echo $1 else echo $2 fi } err_str ( ) { echo "Usage: $0 <number1> <number2>" exit $USG_ERR } NUM_1=$1 NUM_2=$2 x if [ $# -ne 2 ] ; then err_str elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then max_two $NUM_1 $NUM_2 else err_str fi else err_str fi exit 0
上記は少し複雑に見えますが、行を読み通せば簡単です。検証の目的で、つまり正規表現を使用して引数の数とタイプをチェックするために、最初にネストされたif-elseif行。その後、2つのコマンドライン引数を使用して関数を呼び出し、そこに結果を表示します。これは、関数から大きな整数を返すことができないためです。この問題を回避する別の方法は、グローバル変数を使用して結果を関数内に格納することです。以下のスクリプトは、この方法を説明しています。
#!/bin/bash USG_ERR=7 ret_val= max_two ( ) { if [ "$1" -eq "$2" ] ; then echo 'Equal' exit 0 elif [ "$1" -gt "$2" ] ; then ret_val=$1 else ret_val=$2 fi } err_str ( ) { echo "Usage: $0 <number1> <number2>" exit $USG_ERR } NUM_1=$1 NUM_2=$2 if [ $# -ne 2 ] ; then err_str elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then max_two $NUM_1 $NUM_2 echo $ret_val else err_str fi else err_str fi exit 0
次に、次の関数を使用して、前のシェルスクリプトシリーズで説明されたいくつかのエキサイティングな問題を試してください。
- 基本的なLinuxシェルスクリプト言語のヒントを理解する–パートI
- Linux初心者がシェルプログラミングを学ぶための5つのシェルスクリプト–パートII
- Linux BASHスクリプティングの世界を航海する–パートIII
- Linuxシェルプログラミングの数学的側面–パートIV
- シェルスクリプト言語での数式の計算–パートV
次のパートでは、ローカル変数の使用、再帰などの機能機能についてさらに詳しく説明します。コメントで最新情報を入手してください。
-
カスタムシェル関数とライブラリを作成して使用する方法
Linuxでは、シェルスクリプトは、特定のシステム管理タスクの実行や自動化、簡単なコマンドラインツールの作成など、さまざまな方法で役立ちます。 このガイドでは、新しいLinuxユーザーに、カスタムシェルスクリプトを確実に保存する場所、カスタムシェル関数とライブラリの記述方法、他のスクリプトでライブラリの関数を使用する方法を示します。 シェルスクリプトを保存する場所 フルパス/絶対パスを入力せずにスクリプトを実行するには、スクリプトを $ PATHのディレクトリの1つに保存する必要があります。 環境変数。 $ PATHを確認するには 、以下のコマンドを発行します: $ echo $PAT
-
6 つの実用的な例を含む Bash シェル関数のチュートリアル
Bash シェル関数は、グループに単一の名前を使用して、後で実行するために複数の UNIX / Linux コマンドをグループ化する方法です。 . Bash シェル関数は、通常の Unix コマンドと同じように実行できます。シェル関数は、それらを解釈するための新しいプロセスを作成することなく、現在のシェル コンテキストで実行されます。bash エイリアスと関数の両方を使用すると、より長い、またはより複雑なコマンドのショートカットを定義できます。ただし、エイリアスは、このチュートリアルで説明されているように、これらの関数が許可する制御フロー、引数、およびその他の巧妙なものを許可しません。 この