GNU/Linux >> Linux の 問題 >  >> Linux

Bash初心者シリーズ#9:Bashでの関数の使用

bashスクリプトがどんどん大きくなると、物事が非常に乱雑になる可能性があります。

bashスクリプトのさまざまな部分で、同じコードを何度も書き直していることに気付くかもしれません。

幸い、bashの関数を使用してコードを書き直すことを回避できます。これにより、スクリプトがより整理され、読みやすくなります。

このチュートリアルでは、bashシェルスクリプトで関数を作成し、関数値を返し、関数の引数を渡す方法を学習します。

さらに、変数スコープがどのように機能するか、および再帰関数を定義する方法を学習します。

bashで関数を作成する

bash関数を宣言するための2つの異なる構文があります。次の構文は、bash関数を作成するために最も一般的に使用される方法です。

function_name () {
commands
}

bash関数の作成で2番目にあまり使用されないものは、予約された仕事関数で始まり、次のように関数名が続きます。

function function_name {
commands
}

ここで、関数を操作するときによく知っておくべきことがいくつかあります。

  • 関数を呼び出したり呼び出したりしない限り、関数は実行/実行されません。
  • 関数定義は、関数の呼び出しの前に置く必要があります。

関数を実行したいときはいつでも、それを呼び出す必要があります!関数呼び出しは、関数名を参照するだけで実行されます。

次のfun.shをご覧ください bashスクリプト:

#!/bin/bash

hello () {
echo "Hello World"
}

hello
hello
hello

helloという名前の関数を定義しました それは単に「HelloWorld」の行をエコーし​​ます ターミナルに。 こんにちはを3回行ったことに注意してください 関数呼び出しなど、スクリプトを実行すると、「HelloWorld」が表示されます。 画面に3回印刷された線:

[email protected]:~$ ./fun.sh
Hello World
Hello World
Hello World

bashで関数値を返す

多くのプログラミング言語では、関数は呼び出されたときに値を返します。ただし、bash関数は値を返さないため、これはbashには当てはまりません。

bash関数の実行が終了すると、 $?にキャプチャされた最後に実行されたコマンドの終了ステータスが返されます。 変数。ゼロは実行が成功したことを示し、ゼロ以外の正の整数(1-255)は失敗を示します。

返品を使用できます 関数の終了ステータスを変更するステートメント。たとえば、次の error.shを見てください。 スクリプト:

#! /bin/bash

error () {
blabla
return 0
}

error
echo "The return status of the error function is: $?"

error.shを実行した場合 bashスクリプト、出力に驚かれるかもしれません:

[email protected]:~$ ./error.sh
./error.sh: line 4: blabla: command not found
The return status of the error function is: 0

return 0なし ステートメント、エラー 関数がゼロ以外の終了ステータスをblablaとして返すことはありませんでした。 コマンドが見つかりませんになります エラー。

ご覧のとおり、bash関数は値を返しませんが、関数の終了ステータスを変更することで回避策を作成しました。

returnステートメントは関数をすぐに終了することにも注意してください。

bash関数に引数を渡す

bashスクリプトに引数を渡すのと同じように、関数に引数を渡すことができます。関数呼び出しを行うときに、引数を含めるだけです。

実例を示すために、次の iseven.shを見てみましょう。 bashスクリプト:

#!/bin/bash

iseven () {
if [ $(($1 % 2)) -eq 0 ]; then
echo "$1 is even."
else
echo "$1 is odd."
fi
}

iseven 3
iseven 4
iseven 20
iseven 111

iseven() 関数は、数値が偶数か奇数かをテストします。 iseven()に対して4つの関数呼び出しを行いました 。関数呼び出しごとに、iseven()関数の最初の拡張であり、 $ 1によって参照される1つの番号を指定しました。 関数定義の変数。

iseven.shを実行してみましょう 動作することを確認するためのbashスクリプト:

[email protected]:~$ ./iseven.sh
3 is odd.
4 is even.
20 is even.
111 is odd.

また、bash関数の引数とbashスクリプトの引数は2つの異なるものであることにも注意する必要があります。違いを対比するために、次の funarg.shを見てください。 bashスクリプト:

#!/bin/bash

fun () {
echo "$1 is the first argument to fun()"
echo "$2 is the second argument to fun()"
}

echo "$1 is the first argument to the script."
echo "$2 is the second argument to the script."

fun Yes 7

いくつかの引数を指定してスクリプトを実行し、結果を観察します。

[email protected]:~$ ./funarg.sh Cool Stuff
Cool is the first argument to the script.
Stuff is the second argument to the script.
Yes is the first argument to fun()7 is the second argument to fun()

ご覧のとおり、スクリプト引数と関数引数の両方を参照するために同じ変数$1と$2を使用した場合でも、関数内から呼び出された場合、それらは異なる結果を生成します。

bash関数のローカル変数とグローバル変数

Bash変数は、グローバルスコープまたはローカルスコープのいずれかを持つことができます。スコープに関係なく、bashスクリプトのどこからでもグローバル変数にアクセスできます。それどころか、ローカル変数には、関数定義内からのみアクセスできます。

実例を示すために、次の scope.shを見てください。 bashスクリプト:

#!/bin/bash

v1='A'
v2='B'

myfun() {
local v1='C'
v2='D'
echo "Inside myfun(): v1: $v1, v2: $v2"
}

echo "Before calling myfun(): v1: $v1, v2: $v2"
myfun
echo "After calling myfun(): v1: $v1, v2: $v2"

最初に2つのグローバル変数v1を定義しました およびv2 。次に、 myfun()内 定義では、ローカルを使用しました ローカル変数を定義するキーワードv1 グローバル変数v2を変更しました。 異なる関数のローカル変数に同じ変数名を使用できることに注意してください。

次に、スクリプトを実行しましょう:

[email protected]:~$ ./scope.sh
Before calling myfun(): v1: A, v2: B
Inside myfun(): v1: C, v2: D
After calling myfun(): v1: A, v2: D

スクリプトの出力から、次のように結論付けることができます。

  • グローバル変数と同じ名前のローカル変数は、関数本体内のグローバル変数よりも優先されます。
  • 関数内からグローバル変数を変更できます。
再帰関数

再帰関数は、それ自体を呼び出す関数です。再帰関数は、小さなサブ問題に分解できるプログラミングの問題を解決しようとするときに便利です。

階乗関数は、再帰関数の典型的な例です。次のfactorial.shをご覧ください。 bashスクリプト:

#!/bin/bash

factorial () {
if [ $1 -le 1 ]; then
echo 1
else
last=$(factorial $(( $1 -1)))
echo $(( $1 * last ))
fi
}

echo -n "4! is: "
factorial 4
echo -n "5! is: "
factorial 5
echo -n "6! is: "
factorial 6

再帰関数は、ベースケースで始まる必要があります これは必然的に再帰関数呼び出しのチェーンを終了することです。 factorial()で 関数の場合、基本ケースは次のように定義されます。

if [ $1 -le 1 ]; then
echo 1

次に、再帰的なケースを導き出します 階乗関数の場合。数値の階乗を計算するにはn ここでn が1より大きい正の数の場合、 nを掛けることができます n-1の階乗による :

factorial(n) = n * factorial(n-1)

上記の方程式を使用して、この再帰的なケースを記述してみましょう。

last=$(factorial $(( $1 -1)))
echo $(( $1 * last ))

次に、スクリプトを実行して、正しい結果が得られることを確認します。

[email protected]:~$ ./factorial.sh
4! is: 24
5! is: 120
6! is: 720

追加の演習として、n番目のフィボナッチ数を計算する再帰関数を作成してみてください。まず、基本ケースを考え出し、次に再帰ケースを考え出します。あなたはこれを手に入れました!

もっと運動が必要ですか?以下のPDFをダウンロードして、bashスクリプトで関数を練習してください。同じPDFにソリューションもあります。

Bash第9章練習問題この章で学んだことを練習するための問題とその解決策Bash-Chapter-9-Practice-Questions-Linux-Handbook.pdf31KB

素晴らしい!このシリーズの次の最後の章では、これまでに学んだことをすべて適用して、退屈な管理タスクを自動化する効果的なbashスクリプトを作成します。


Linux
  1. 自動化のためのBashの使用

  2. シェル変数の関数?

  3. Bash で関数を作成して呼び出す方法

  1. Bash初心者シリーズ#8:Bashのループ

  2. Bashでのケースステートメントの使用

  3. ウォッチを使用してBashで関数を繰り返し実行しますか?

  1. Bash関数

  2. シェルスクリプトパートV:Bashの関数

  3. Bashスクリプティング–例で説明されている関数