Bashスクリプト、パート6:関数とライブラリーの開発

Bashスクリプト:開始

Bashスクリプト、パート2:ループ

Bashスクリプト、パート3:オプションとコマンドラインスイッチ

Bashスクリプト、パート4:入力と出力

Bashスクリプト、パート5:シグナル、バックグラウンドタスク、スクリプト管理

Bashスクリプト、パート6:関数とライブラリーの開発

Bashスクリプト、パート7:sedとワープロ

Bashスクリプト、パート8:awkデータ処理言語

Bashスクリプトパート9:正規表現

Bashスクリプト、パート10:ケーススタディ

Bashスクリプト、パート11:対話型ユーティリティの期待と自動化


bashスクリプトを開発するとき、遅かれ早かれ、定期的に同じコードフラグメントを使用する必要があるという事実に気付くでしょう。 常に手動で入力するのは退屈で、コピーと貼り付けは私たちの方法ではありません。 になる方法 一度コードのブロックを記述できるツールを見つけたら、それが再び必要になったら、スクリプトでそれを参照するだけでいいでしょう。







bashシェルはこの機能を提供し、関数を作成できるようにします。 bash関数は、スクリプトで再利用できるコードの名前付きブロックです。







関数宣言



関数は次のように宣言できます。



functionName { }
      
      





または:



 functionName() { }
      
      





関数は、引数なしおよび引数付きで呼び出すことができます。



関数を使用する



関数宣言を含むスクリプトを作成して使用します。



 #!/bin/bash function myfunc { echo "This is an example of using a function" } count=1 while [ $count -le 3 ] do myfunc count=$(( $count + 1 )) done echo "This is the end of the loop" myfunc echo "End of the script"
      
      





ここでmyfunc



呼ばれるmyfunc



作成されます。 関数を呼び出すには、名前を指定するだけです。









関数呼び出しの結果



関数は、必要な回数だけ呼び出すことができます。 宣言する前に関数を使用しようとすると、エラーが発生することに注意してください。 これを示すスクリプトを作成します。



 #!/bin/bash count=1 while [ $count -le 3 ] do myfunc count=$(( $count + 1 )) done echo "This is the end of the loop" function myfunc { echo "This is an example of using a function" } echo "End of the script"
      
      





予想どおり、発売後は何も起こりませんでした。









宣言される前に関数を使用しようとしています



関数の名前を考えるとき、それらは一意でなければならないことに注意してください。そうでなければ、問題は避けられません。 以前に宣言した関数をオーバーライドすると、通知またはエラーメッセージなしで、古い関数の代わりに新しい関数が呼び出されます。 例でこれを示しましょう。



 #!/bin/bash function myfunc { echo "The first function definition" } myfunc function myfunc { echo "The second function definition" } myfunc echo "End of the script"
      
      





ご覧のとおり、新しい関数は古い関数を静かに消去しました。









関数オーバーライド



returnコマンドを使用する



return



コマンドを使用すると、関数から返される整数の終了コードを指定できます。 関数を呼び出した結果を処理する方法は2つあります。 これが最初のものです:



 #!/bin/bash function myfunc { read -p "Enter a value: " value echo "adding value" return $(( $value + 10 )) } myfunc echo "The new value is $?"
      
      





echo



コマンドは、入力された数値と数値10 echo



合計を出力しました。









関数から返された値を出力します



myfunc



は、 $value



変数に含まれる数値に10を加算します。この値は、スクリプトの実行中にユーザーによって設定されます。 次に、 return



コマンドを使用して結果を返します。 返される関数は、 $?



変数を使用するecho



コマンドによって出力されます$?





変数$?



から抽出する前に他のコマンドを実行した場合 関数によって返される値。この値は失われます。 実際、この変数には最後に実行されたコマンドのリターンコードが格納されています。



returnコマンドがreturn



ことができる最大数は255であることに注意してください。関数がより大きな数または文字列を返す必要がある場合、別のアプローチが必要になります。



関数出力を変数に書き込む



関数の結果を返す別の方法は、関数が出力するデータを変数に書き込むことです。 このアプローチは、 return



コマンドの制限を回避し、関数からデータを返します。 例を考えてみましょう:



 #!/bin/bash function myfunc { read -p "Enter a value: " value echo $(( $value + 10 )) } result=$( myfunc) echo "The value is $result"
      
      





このスクリプトを呼び出した後は次のようになります。









関数結果を変数に書き込む



関数の引数



bash関数は、時間とスペースを節約する小さなコードと見なすことができ、キーボードから常に入力したり、同じコマンドセットをコピーしたりする必要がなくなります。 ただし、機能ははるかに広くなっています。 特に、引数を渡すことについて話している。



関数は標準の位置パラメータを使用できます。これは、呼び出されたときに渡されるものを記録します。 たとえば、関数の名前はパラメータ$0



格納され、最初に渡される引数は$1



番目の引数は$2



などになります。 関数に渡された引数の数は、変数$#



を参照することで確認できます。 この資料シリーズの第3部に精通している場合、スクリプトに渡されるコマンドラインパラメーターをスクリプトが処理する方法と非常によく似ていることに気づかずにはいられません。



引数は、名前の後に関数を記述することで関数を渡します。



 myfunc $val1 10 20
      
      





関数を引数で呼び出して処理する例を次に示します。



 #!/bin/bash function addnum { if [ $# -eq 0 ] || [ $# -gt 2 ] then echo -1 elif [ $# -eq 1 ] then echo $(( $1 + $1 )) else echo $(( $1 + $2 )) fi } echo -n "Adding 10 and 15: " value=$(addnum 10 15) echo $value echo -n "Adding one number: " value=$(addnum 10) echo $value echo -n "Adding no numbers: " value=$(addnum) echo $value echo -n "Adding three numbers: " value=$(addnum 10 15 20) echo $value
      
      





スクリプトを実行します。









引数付きの関数呼び出し



addnum



関数は、スクリプトから呼び出されたときに渡された引数の数をチェックします。 ない場合、または3つ以上ある場合、関数は-1を返します。 パラメーターが1つしかない場合は、パラメーターを追加して結果を返します。 2つのパラメーターがある場合、関数はそれらを追加します。



関数は、コマンドラインから実行されたときにスクリプトに渡されるパラメーターを直接操作できないことに注意してください。 たとえば、次のスクリプトを記述します。



 #!/bin/bash function myfunc { echo $(( $1 + $2 )) } if [ $# -eq 2 ] then value=$( myfunc) echo "The result is $value" else echo "Usage: myfunc  a b" fi
      
      





起動時、または宣言された関数を呼び出すときにエラーメッセージが表示されます。









関数は、スクリプトに渡されたパラメーターを直接使用できません



代わりに、関数がコマンドラインから呼び出されたときにスクリプトに渡されたパラメーターを使用する予定の場合は、呼び出されたときにそれらにパラメーターを渡す必要があります。



 #!/bin/bash function myfunc { echo $(( $1 + $2 )) } if [ $# -eq 2 ] then value=$(myfunc $1 $2) echo "The result is $value" else echo "Usage: myfunc a b" fi
      
      





これですべてが正常に機能するようになりました。









スクリプトを実行しているパラメーターに関数を渡す



関数で変数を操作する



シナリオで使用する変数は、スコープによって特徴付けられます。 これらは、これらの変数を操作するコード内の場所です。 関数内で宣言された変数は、すでに遭遇した変数とは異なる動作をします。 スクリプトの他の部分から隠すことができます。



2種類の変数があります。





▍グローバル変数



グローバル変数は、bashスクリプトのどこからでも見える変数です。 メインスクリプトコードでグローバル変数を宣言した場合、関数からそのような変数にアクセスできます。



関数で宣言されたグローバル変数についてもほぼ同じことが言えます。 関数を呼び出した後、メインスクリプトコードでそれらにアクセスすることもできます。



デフォルトでは、スクリプトで宣言されたすべての変数はグローバルです。 したがって、関数の外で宣言された変数は、関数から問題なくアクセスできます。



 #!/bin/bash function myfunc { value=$(( $value + 10 )) } read -p "Enter a value: " value myfunc echo "The new value is: $value"
      
      





このスクリプトが出力するものは次のとおりです。









関数からグローバル変数にアクセスする



関数で変数に新しい値が割り当てられると、関数が完了した後にスクリプトが変数にアクセスしても、この新しい値は失われません。 これが前の例で見られるものです。



この動作が私たちに合わない場合はどうなりますか? 答えは簡単です-ローカル変数を使用する必要があります。



▍ローカル変数



関数内で宣言して使用する変数は、ローカルで宣言できます。 これを行うには、変数名の前にlocal



キーワードを使用します。



 local temp=$(( $value + 5 ))
      
      





関数の外部に同じ名前の変数がある場合、これは影響しません。 local



キーワードを使用すると、関数内で使用される変数を残りの変数から分離できます。 例を考えてみましょう:



 #!/bin/bash function myfunc { local temp=$[ $value + 5 ] echo "The Temp from inside function is $temp" } temp=4 myfunc echo "The temp from outside is $temp"
      
      





スクリプトを実行します。









関数内のローカル変数



ここで、関数内で$temp



変数を操作する場合、外部の同じ名前の変数に割り当てられた値には影響しません。



配列関数を引数として渡す



配列を引数として渡してみましょう。 私はすぐにそのような設計が正しく機能しないと言いたいです:



 #!/bin/bash function myfunc { echo "The parameters are: $@" arr=$1 echo "The received array is ${arr[*]}" } myarray=(1 2 3 4 5) echo "The original array is: ${myarray[*]}" myfunc $myarray
      
      











配列を関数に渡す間違ったアプローチ



例からわかるように、配列関数を渡すと、最初の要素にのみアクセスできます。



この問題を解決するには、配列からデータを抽出し、独立した引数として関数に渡す必要があります。 必要に応じて、関数内で受け取った引数を再度配列に収集できます。



 #!/bin/bash function myfunc { local newarray newarray=("$@") echo "The new array value is: ${newarray[*]}" } myarray=(1 2 3 4 5) echo "The original array is ${myarray[*]}" myfunc ${myarray[*]}
      
      





スクリプトを実行します。









関数内の配列アセンブリ



例からわかるように、関数は渡された引数の配列を収集しました。



再帰関数



再帰は、関数がそれ自体を呼び出すときです。 再帰の典型的な例は、階乗を計算する関数です。 数値の階乗は、1からこの数値までのすべての自然数の積です。 たとえば、階乗5は次のように見つかります。



 5! = 1 * 2 * 3 * 4 * 5
      
      





階乗を計算する式を再帰形式で記述すると、次の結果が得られます。



 x! = x * (x-1)!
      
      





この式を使用して、再帰関数を作成できます。



 #!/bin/bash function factorial { if [ $1 -eq 1 ] then echo 1 else local temp=$(( $1 - 1 )) local result=$(factorial $temp) echo $(( $result * $1 )) fi } read -p "Enter value: " value result=$(factorial $value) echo "The factorial of $value is: $result"
      
      





このスクリプトが正しく機能するかどうかを確認してください。









階乗計算



ご覧のとおり、すべてが正常に機能しています。



ライブラリの作成と使用



これで、関数の記述方法と、宣言されている同じスクリプトで関数を呼び出す方法がわかりました。 コピーアンドペーストを使用せずに、別のスクリプトで関数を表すコードブロックを使用する必要がある場合はどうでしょうか。



bashシェルを使用すると、いわゆるライブラリ(関数を含むファイル)を作成し、必要なスクリプトでこれらのライブラリを使用できます。



ライブラリを使用する鍵は、 source



コマンドにあります。 このコマンドは、ライブラリをスクリプトに接続するために使用されます。 その結果、ライブラリで宣言された関数はスクリプトで使用可能になります。そうでない場合、ライブラリの関数は他のスクリプトのスコープでは使用できません。



source



コマンドには、ドット演算子というエイリアスがあります。 スクリプトにファイルを含めるには、次のタイプのデザインをスクリプトに追加する必要があります。



 . ./myscript
      
      





次を含むmyfuncs



ファイルがあるとします。



 function addnum { echo $(( $1 + $2 )) }
      
      





これはライブラリです。 スクリプトで使用します。



 #!/bin/bash . ./myfuncs result=$(addnum 10 20) echo "The result is: $result"
      
      





彼に電話します。









ライブラリを使用する



スクリプト内でライブラリ関数を使用しました。 これはすばらしいことですが、ライブラリで宣言された関数をコマンドラインから呼び出す場合はどうでしょうか。



コマンドラインからbash関数を呼び出す



このシリーズの前のパートをマスターしている場合は、おそらくライブラリーからの関数をファイルに含めることができることを既にご存じでしょう。 source



コマンドを使用したbashrc



。 その結果、コマンドラインから直接関数を呼び出すことができます。



.bashrc



を編集して、次の行を追加します(システム上のライブラリファイルへのパスは当然異なります)。



 . /home/likegeeks/Desktop/myfuncs
      
      





これで、コマンドラインから関数を直接呼び出すことができます。



 $ addnum 10 20
      
      











コマンドラインから関数を呼び出す



さらに良いのは、そのようなライブラリがシェルのすべての子プロセスで利用できることです。つまり、このライブラリをそれらに接続することを心配せずにbashスクリプトで使用できます。



上記の例を機能させるには、ログアウトしてから再度ログインする必要がある場合があることに注意してください。 さらに、ライブラリーからの関数の名前が標準コマンドの名前と一致する場合、関数が代わりに呼び出されることに注意してください。 したがって、関数名には注意してください。



まとめ



bashスクリプトの関数を使用すると、コードブロックのスタイルを設定して、スクリプトで呼び出すことができます。 また、最も一般的に使用される関数は、 source



演算子を使用してスクリプトに接続できるライブラリに割り当てる必要があります。 あなたの関数の中にあなたが生きていけないものがある場合、あなたは.bashrc



でそれらとライブラリを接続することができ.bashrc



。 これにより、コマンドラインまたは他のスクリプトで使用するのが便利になります。 主なことは、関数の名前が組み込みコマンドの名前と一致しないことです。



今日は以上です。 次回sed —



強力なライン処理ツールsed —



について説明します。







親愛なる読者! 日常の問題を解決するために、独自のデザインの機能を使用していますか?



All Articles