Bash で関数を使う方法

  1. Bash で関数を定義する
  2. Bash における変数の範囲
  3. Bash の関数からの戻り値
  4. Bash 関数への引数の渡し方

関数はすべてのプログラミング言語において最も重要な要素の一つであり、コードを再利用可能で読みやすいものにしてくれます。繰り返し使われる同じコードは、関数の中に書かれています。そして、コードブロックが必要なときは、定義された関数を呼び出すだけです。

Bash で関数を定義する

Bash で関数を定義するには、以下の 2つのアプローチのいずれかを用いることができる。

このアプローチでは、関数名の後に括弧をつけて書きます。この方法では、関数名の後に括弧をつけて記述します。この形式を用いた関数は、以下のいずれかの形式を用いて定義することができる。

function_name(){
statements
}
function_name() { statements }

この方法では、関数名の前に function キーワードを指定します。

function_name(){
statements
}
function_name() { statements }

中括弧内の文は、その関数が何をするかを決定します。関数名はその関数が何をするかとは何の関係もありませんが、関数名は説明的なものにしなければなりません。関数を定義しても何もしません。関数の定義にあるコマンドを実行するには、関数を呼び出さなければならない。

Bash で関数を呼び出すには、関数の名前を使う。

#! /bin/bash

greet(){
    echo 'Hello, Folks. Welcome to DelftStack!'
}

greet

出力:

Hello, Folks. Welcome to DelftStack!

ここでは、最初に greet という名前で関数を定義してから関数を呼び出す。関数を呼び出すと、関数定義の中の文が実行されるので、Hello, Folks. Welcome to DelftStack!

別のアプローチを使用して関数を次のように定義することもできます。

#! /bin/bash

function greet(){
    echo 'Hello, Folks. Welcome to DelftStack!'
}

greet

出力:

Hello, Folks. Welcome to DelftStack!

関数を呼び出す前に、必ず関数を定義する必要があります。

Bash における変数の範囲

Bash では他のプログラミング言語と同様に、変数のスコープはグローバルかローカルのどちらかになります。しかし、変数のデフォルトのスコープは、関数スコープ内で宣言されていても常にグローバルです。変数をローカルにするには local キーワードを使わなければなりません。

#! /bin/bash

gvar1=1
gvar2=2

change_variables() {

    local gvar1=10
    gvar2=7
    
    echo "Inside Function: gvar1: $gvar1, gvar2: $gvar2"
}

echo "Before executing function: gvar1: $gvar1, gvar2: $gvar2"

change_variables

echo "After executing function: gvar1: $gvar1, gvar2: $gvar2"

出力:

Before executing function: gvar1: 1, gvar2: 2
Inside Function: gvar1: 10, gvar2: 7
After executing function: gvar1: 1, gvar2: 7

ここでは、先頭に宣言された gvar1gvar2 がグローバル変数である。

関数内部では、gvar1local キーワードを使っているので、gvar1 はローカル変数として宣言されているが、gvar2local キーワードを持っていないので、グローバル変数を参照していることになる。したがって、gvar2 の値は関数によってグローバルに変更され、gvar1 の値は関数内でのみ変更されることになります。

Bash の関数からの戻り値

他のプログラミング言語とは逆に、Bash は関数から値を返すことができません。Bash の関数から返される値は、関数内で最後に実行された文の状態である。0 の数字は成功を、1-255 の数字は失敗を表します。関数の終了ステータスは return キーワードを用いて指定することができる。また、return 文は関数を終了させる。

#! /bin/bash

return_value(){
  echo "This function returns 20!"
  return 30
  echo "After return statement"
}

return_value
echo $?

出力:

This function returns 20!
30

ここでは、関数 return_valuereturn 文を用いて 30 という値を返し、その値が変数 $? に代入されていることがわかります。

また、return 文以下のコマンドは実行されないため、return 文の実行後に関数が終了することにも注意する必要がある。

関数から値を返したい場合は、グローバル変数に値を代入し、関数の外部からその変数にアクセスして値を取得することができる。

#! /bin/bash

send_message(){
  message_from_function="Hello From the function!"
}
send_message
echo $message_from_function

出力:

Hello From the function!

プログラムでは、返す値をグローバル変数 message_from_function に代入して、変数の戻り値にアクセスしています。

Bash 関数への引数の渡し方

Bash の関数に引数を渡すには、関数の後に引数を置くだけです。複数の引数を関数に渡したい場合は、引数をスペースで区切ります。引数のスペルミスを避けるために、引数をダブルクォートで囲むことができます。

パラメータは、その位置に応じて $1 $2 などでアクセスされる。$0 は関数名を表し、$# は関数内の位置引数の数を保持します。

#! /bin/bash

send_message(){
  message_from_function="Hello $1 "
}
send_message
echo $message_from_function "Delft!"

出力:

Hello Delft!

ここでは、引数 Delft! が関数に渡され、パラメーター $1 によって関数内でアクセスされ、関数からの最終出力として Hello Delft! が取得されます。

comments powered by Disqus