ウェブサイト検索

Bash関数の作り方と活用方法


関数は、プログラミング言語のいずれにおいても、関数を呼び出すことによって異なるタイプで使用できるコードブロックを定義するのに役立つ部分です。Bashの関数における関数宣言と関数引数の使い方は、他のプログラミング言語とは異なります。Bashで関数を定義する際に、関数キーワードを使用することは必須ではありません。一般的に、$1、$2、$3…$n変数は、Bashで関数引数を読み取るために使用されます。Bashで関数を呼び出す際に、括弧“() ”も必要ありません。このチュートリアルでは、複数の例を用いてユーザー定義のBash関数の作成と使用方法を示します。

さまざまな種類のBash関数引数

さまざまな種類のBash関数引数の目的は次のように説明されます:

関数引数目的
$0
それには、場所とスクリプト名が含まれています。
$#
引数の合計数をカウントします。
$@ OR $*
位置引数リストが含まれています。
“$@”
リストから別の文字列を抽出します。
“$*”
それはリストを文字列として抽出します。
$1, $2, …$n
これらの変数は、関数名の後に渡される引数を読み取るために使用されます。

コンテンツの一覧:

  1. 関数を定義して呼び出す
  2. グローバル変数を使って関数を定義する
  3. ローカル変数を使って関数を定義する
  4. 引数を持つ関数を定義する
  5. 単一の値を返す関数を定義する
  6. 複数の値を返す関数を定義する
  7. コマンドをオーバーライドする関数を定義する
  8. ファイルから読み取るための関数を定義する
  9. ファイルに書き込むための関数を定義する
  10. 参照引数を読み取る関数を定義する

関数を定義して呼び出す

Bashスクリプトでシンプルな関数を宣言し、その関数を呼び出す方法は、以下のスクリプトに示されています。この関数は呼び出されるとシンプルなメッセージを表示します。

#!/bin/bash

#The way to declare and call the bash function
#has been shown in this script

#Define a simple function
function testFunc
{
    echo "It is a testing function."
}

#Call the function
testFunc

出力:

次の出力は、前のスクリプトを実行した後に表示されます。「これはテスト関数です」というメッセージは、関数を呼び出した後に印刷されます。

トップへ行く

グローバル変数を使って関数を定義する

関数の外で宣言された変数をグローバル変数と呼びます。これらの変数はスクリプトのどこでもアクセス可能です。Bash関数内でグローバル変数を読み取る方法は、以下のスクリプトに示されています。ユーザーから2つの文字列値を入力として受け取ります。スクリプトから関数が呼び出されると、入力値が空でない場合は入力値の連結された値が印刷されます。そうでない場合は、エラーメッセージが印刷されます。

#!/bin/bash

#Take input from the user
read -p "Enter the first name: " firstname
read -p "Enter the last name: " lastname

#Define a simple function
concat_str
{
     #Check whether the global variables are empty or not
     if [[ ! -z $firstname && ! -z $lastname ]]
     then
        echo "Full Name: $firstname $lastname"
     else
        echo "First name or Last name is empty."
     fi

}

#Call the function
concat_str

出力:

次の出力は、入力値「ニラ」と「ラーマン」でスクリプトを実行した後に表示されます:

トップへ行く

ローカル変数を使って関数を定義する

関数内で使用される変数はローカル変数と呼ばれます。以下のスクリプトでは、グローバル変数とローカル変数の両方が使用されています。このスクリプトの関数は、グローバル変数の値が5で割り切れるかどうかを判定します。ここで、「$number」はグローバル変数で、「$remainder」はローカル変数です。

#!/bin/bash

#Define a global variable
number=65

#Define a function
function calculate
{
     #Define a local variable
     local remainder=$(($number%5))

     #Check whether the number is divisible by 5 or not
     if [ $remainder == 0 ]
     then
        echo "$number is divisible by 5."
     else
        echo "$number is not divisible by 5."
     fi
}

#Call the function
Calculate

出力:

スクリプトを実行した後、次の出力が表示されます。ここで、“$number”の値は65で、5で割り切れることを示しています:

トップへ行く

引数を持つ関数を定義する

複数の引数は、Bashで関数名の後に空白で引数を区切ることによって関数に渡されます。$1、$2、$3などの変数は、引数の値を順番に読み取るために使用されます。関数を初めて呼び出すときに4つの数値が引数値として渡されます。関数を2回目に呼び出すときに4つの変数が引数値として渡されます。関数はすべての引数値の合計を返します。

#!/bin/bash

addition()
{
    #Read the argument values
    n1=$1
    n2=$2
    n3=$3
    n4=$4
    #Calculate the sum of the arguments
    ((sum=$n1+$n2+$n3+$n4))
    #Print the calculated result
    echo "The sum of $n1, $n2, $n3, and $n4 is $sum"
}

#Call the function with 4 numeric arguments
addition 10 30 20 40

#Take four numbers from the user
read -p "Enter 4 numbers: " num1 num2 num3 num4
#Check the four variables
if [[ ! -z $num1 && ! -z $num2 && ! -z $num3 && ! -z $num4 ]]
then
    addition $num1 $num2 $num3 $num4
else
    echo "Four numbers are not taken."
fi

出力:

スクリプトを実行した後、次の出力が表示されます。10、30、20、および40の合計は100で、6、9、5、および3の合計は23です。正しい値が出力に印刷されます:

トップへ行く

単一の値を返す関数を定義する

Bash関数は、単一または複数の値を返すことができます。「return」ステートメントは、Bash関数から数値を返すために使用されます。「echo」コマンドは、関数から関数の呼び出し元に単一または複数の値を返すために使用されます。次のスクリプトでは、関数を使用してユーザーから取得した2つの数値の積を返します。「$?」は、関数から返された値を読み取るために使用されます。

#!/bin/bash

#Take two numbers from the user
read -p "Enter the first number: " n1
read -p "Enter the second number: " n2

#Define a function to calculate the multiplication of two numbers
multiply_number ()
{
    #Multiply two numbers
    ((result=n1*n2))
    #Return the result of the multiplication
    return $result
}

#Call the function
multiply_number
#Print the returned value
echo "The multiplication of $n1 and $n2 is $?"

出力:

次の出力は、入力5と3に対してスクリプトを実行した後に表示されます。5と3の掛け算の結果は15です。

トップへ行く

複数の値を返す関数を定義する

以下のスクリプトでは、「echo」コマンドが関数内で使用され、関数の呼び出し元に配列を返します。数値の入力値が関数への引数として渡されます。ユーザーからの入力を取得し、関数の引数の値に基づいて配列に格納するためにループが実行されます。次に、この配列が関数の呼び出し元に返されます。「read」コマンドは、返された値を配列に格納するために使用され、後で印刷されます。

#!/bin/bash
#Define a function to return multiple values
return_multiple_values ()
{
   #Declare an array
   declare -a students
   #Iterate the loop to insert values into an array
   for (( i=0; i<$1; i++ ))
   do
       read -p "Enter a student name: " name
       students[$i]=$name
   done
   #Return the array to the caller
   echo ${students[@]}
}

#Take the number of students from the users
read -p "Enter the number of students: " std

#Call the function with one argument
return_array=$(return_multiple_values $std)
#Store the return value in an array
read -a std_arr <<< $return_array

#Print the array values
echo "Array values are:"
for val in "${std_arr[@]}"
do
  echo "$val"
done

出力:

スクリプトを実行した後、以下の出力が表示されます。この出力によると、「Meena」、「Jafar」、「Sultana」の文字列値はユーザーから取得されて「$students」配列に保存されます。この配列は後で関数から返されます:

トップへ行く

コマンドをオーバーライドする関数を定義する

Bashには、さまざまな目的のために多くの組み込みコマンドがあります。任意のコマンドのタスクは、そのコマンドの名前を持つBash関数を書いて上書きできます。スクリプトは、その後、メインコマンドの代わりに上書きされた関数を実行します。以下のスクリプトでは、「printf」コマンドのために上書きされた関数が書かれています。ここでは、「pritnf」関数が2つの引数を持って呼び出され、関数内の「printf」と「echo」コマンドを使用して印刷されます。

#!/bin/bash

#Print the output using the builtin `printf` command
printf "%s\n" "Learn Bash Programming."

printf ()
{
    #Print the first argument using `printf`
    builtin printf "%s\n" $1
    #Print the second argument using `echo`
    builtin echo $2
}

#Call the overridden function with two arguments
printf  "Learn bash from LinuxHint" "Shell Programming"

出力:

スクリプトを実行した後、以下の出力が表示されます。出力では、最初のメッセージは「printf」コマンドを使用して印刷されます。その後、最初の引数の値の各単語が改行で印刷され、関数を呼び出した後に2番目の引数の値が1行に印刷されます:

トップへ行く

ファイルから読み取る関数を定義する

Bash関数を使用してファイルを読み取る方法は、以下のスクリプトに示されています。ファイル名はユーザーから取得されます。そのファイルが存在する場合、関数を呼び出した後に「while」ループを使用してファイルの内容が読み取られます。

#!/bin/bash

#Take the filename
read -p "Enter a filename: " filename

#Define a function to read the file content
function read_text_file() {
    while read data;
        do
            echo "$data"
        done
} < $filename

echo "The content of the file is given below: "
#Call the function
read_text_file

出力:

スクリプトを入力値「test.txt」で実行した後、次の出力が表示されます。このファイルの内容は、スクリプトを実行することで印刷されます。その後、「cat」コマンドが使用され、ファイルの元の内容を確認します。この内容はスクリプトの出力と同じです:

トップへ行く

ファイルに書き込むための関数を定義する

Bash関数を使用してファイルに書き込む方法は、以下のスクリプトに示されています。ファイル名はユーザーから取得されます。関数が呼び出されて、3行をファイルに書き込みます。その後、成功メッセージが印刷されます。

#!/bin/bash

#Take the filename
read -p "Enter the filename to create: " filename

function write_into_file()
{
   echo "It is the first line."
   echo "It is the second line."
   echo "It is the third line."

} > $filename

#Call the function to write into the file
write_into_file
echo "File is created successfully."

出力:

入力値「test_file.txt」でスクリプトを実行した後に次の出力が表示されます。その後、「cat」コマンドが使用されてファイルの内容を確認します:

トップへ行く

参照引数を読み取る関数を定義する

参照引数はBash関数に渡すことができます。以下のスクリプトでは、年の値がユーザーから取得されます。そして、入力値は通常の引数として渡され、もう一つの引数は関数を呼び出す際に参照として渡されます。この関数は、その年がうるう年かどうかを確認し、その結果を参照変数に格納します。そして、参照変数が出力されます。

#!/bin/bash

#Define a function to use a reference variable
function use_of_reference_var()
{
    #Read the first argument
    year=$1
    #Check whether the year is a leap year or not
    if [ `expr $year % 4` -eq 0 ]
    then
        str="$year is leap year"
    else
        str="$year is not a leap year"
    fi
}

#Take a year value from the user
read -p "Enter a year value: " yr
#Call the function with a normal argument and a reference argument
use_of_reference_var $yr str
#Print the value of the reference variable
echo $str

出力:

2023年はうるう年ではないため、入力値2023でスクリプトを実行した後に以下の出力が表示されます。

トップへ行く

2008という入力値でスクリプトを実行した後に次の出力が表示されます。これはうるう年です:

トップへ行く

結論

このチュートリアルでは、10のシンプルなBashの例を使ってBash関数の複数の使い方を示しています。このチュートリアルを正しく読むことで、新しいBashユーザーはBash関数の使用に関する明確な概念を得ることができます。