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

BashスクリプティングPart6–Bash関数の作成と使用

bash関数について説明する前に、この状況について説明しましょう。 bashスクリプトを作成すると、同じコードを複数の場所で使用していることに気付くでしょう。

bashスクリプトで同じコード行を何度も書くことにうんざりしている場合は、コードのブロックを1回記述して、bashスクリプトの任意の場所で呼び出すと便利です。

bashシェルを使用すると、関数でそれを実行できます。 。

Bash関数 コードのどこでも再利用できるコードのブロックです。スクリプトでこのコードブロックを使用する場合は、指定された関数名を入力するだけです。

bash関数を作成する方法と、シェルスクリプトでそれらを使用する方法について説明します。

関数の作成

次のような関数を定義できます:

functionName() {

}

関数を定義するには、角かっこ()が必要です。

また、functionキーワードを使用して関数を定義することもできますが、このキーワードはPOSIXの移植性のために非推奨になっています。

function functionName() {

	# Deprecated definition but still used and working

}

2番目の定義では、角かっこは必要ありません。

関数の使用

#!/bin/bash

myfunc() {

	echo "Using functions"

}

total=1

while [ $total -le 3 ]; do

	myfunc

	total=$(($total + 1))

done

echo "Loop finished"

myfunc

echo "End of the script"

ここでは、myfuncという関数を作成しました。これを呼び出すには、名前を入力するだけです。

関数は何度でも呼び出すことができます。

注意:定義されていない関数を使用しようとすると、どうなりますか?

#!/bin/bash

total=1

while [ $total -le 3 ]; do

	myfunc

	total=$(($total + 1))

done

echo "Loop End"

myfunc() {

	echo "Using function ..."

}

echo "End of the script"

ああ、そのような機能がないのでエラーです。

別の注意:bash関数名は一意である必要があります。それ以外の場合、新しい関数はエラーなしで古い関数をキャンセルします。

#!/bin/bash

myfunc() {

	echo "The first function definition"

}

myfunc

function myfunc() {

	echo "The second function definition"

}

myfunc

echo "End of the script"

ご覧のとおり、2番目の関数定義は最初の関数定義からエラーなしで制御されるため、関数を定義するときは注意してください。

returnコマンドの使用

returnコマンドは、関数から整数を返します。

returnコマンドを使用する方法は2つあります。最初の方法は次のようなものです:

#!/bin/bash

myfunc() {

	read -p "Enter a value: " value

	echo "adding value"

	return $(($value + 10))

}

myfunc

echo "The new value is $?"
>

myfunc関数は$value変数に10を追加し、$?を使用して合計を表示します。可変。

関数の値を取得する前にコマンドを実行しないでください。変数$?最後の行のステータスを返します。

このreturnメソッドは整数を返します。文字列を返すのはどうですか?

関数出力の使用

bash関数から値を返す2番目の方法は、コマンド置換です。このようにして、関数から何でも返すことができます。

#!/bin/bash

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

addnum() {

	if [ $# -gt 2 ]; then

		echo "Incorrect parameters passed" # If parameters no equal 2

	else

		echo $(($1 + $2)) # Otherwise add them

	fi

}

echo -n "Adding 10 and 15: "

value=$(addnum 10 15)

echo $value

echo -n "Adding three numbers: "

value=$(addnum 10 15 20)

echo $value

addnum関数は、渡されたパラメーターの数を取得します。 2より大きい場合は、-1を返します。

パラメータが1つある場合、addnum関数はこのパラメータを2回追加します。 2つのパラメーターが渡された場合、addnum関数はそれらを合計し、3つのパラメーターを追加しようとすると、-1を返します。

関数内で渡されたパラメーターを使用しようとすると、失敗します:

#!/bin/bash

myfunc() {

	echo $(($1 + $2 + $3 + $4))

}

if [ $# -eq 4 ]; then

	value=$(myfunc)

	echo "Total= $value"

else

	echo "Passed parameters like this: myfunc a b c d"

fi

代わりに、次のような関数に送信する必要があります:

#!/bin/bash

myfunc() {

	echo $(($1 + $2 + $3 + $4))

}

if [ $# -eq 4 ]; then

	value=$(myfunc $1 $2 $3 $4)

	echo "Total= $value"

else

	echo "Passed parameters like this: myfunc a b c d"

fi

今では動作します!!

Bash関数で変数を処理する

使用するすべての変数にはスコープがあります。スコープは、スクリプトに対する可変の可視性です。

次の2種類の変数を定義できます。

  • グローバル
  • ローカル

グローバル変数

それらはbashスクリプトのどこにでも表示され、有効です。関数内からその値を取得することもできます。

関数内でグローバル変数を宣言すると、関数の外部からその値を取得できます。

宣言する変数はすべて、デフォルトでグローバル変数です。関数の外部で変数を定義する場合、問題なく関数の内部で変数を呼び出します。

#!/bin/bash

myfunc() {

	input=$(($input + 10))

}

read -p "Enter a number: " input

myfunc

echo "The new value is: $input"

関数内で変数値を変更すると、関数外で値が変更されます。

では、このようなことをどのように克服するのでしょうか?ローカル変数を使用します。

ローカル変数

関数内でのみ変数を使用する場合は、次のようにlocalキーワードを使用してローカル変数として宣言できます。

local tmp=$(( $val + 10 ))

したがって、2つの変数があり、1つは関数の内側にあり、もう1つは関数の外側にあり、それらの名前が同じである場合、それらは互いに影響しません。

#!/bin/bash

myfunc() {

	local tmp=$(($val + 10))

	echo "The Temp from inside function is $tmp"

}

tmp=4

myfunc

echo "The temp from outside is $tmp"

myfunc関数内で$tmp変数を使用しても、関数外にある$tmpの値は変更されません。

配列をパラメーターとして渡す

配列をパラメーターとして関数に渡すとどうなりますか:

#!/bin/bash

myfunc() {

	echo "The parameters are: [email protected]"

	arr=$1

	echo "The received array is ${arr[*]}"

}

my_arr=(5 10 15)

echo "The old array is: ${my_arr[*]}"

myfunc ${my_arr[*]}

この関数は、配列変数の最初の値のみを取ります。

配列を単一の値に分解してから、これらの値を関数パラメーターとして使用する必要があります。最後に、次のような関数でそれらを配列にパックします。

#!/bin/bash

myfunc() {

	local new_arr

	new_arr=("[email protected]")

	echo "Updated value is: ${new_arr[*]}"

}

my_arr=(4 5 6)

echo "Old array is ${my_arr[*]}"

myfunc ${my_arr[*]}

関数のおかげで配列変数が再構築されました。

再帰関数

この機能により、関数は関数自体の中から自分自身を呼び出すことができます。

再帰関数の典型的な例は、階乗の計算です。 3の階乗を計算するには、次の方程式を使用します。

3! =1 * 2 * 3

代わりに、次のような再帰関数を使用できます。

x! = x * (x-1)!

したがって、bashスクリプトを使用して階乗関数を作成するには、次のようになります。

#!/bin/bash

fac_func() {

	if [ $1 -eq 1 ]; then

		echo 1

	else

		local tmp=$(($1 - 1))

		local res=$(fac_func $tmp)

		echo $(($res * $1))

	fi

}

read -p "Enter value: " val

res=$(fac_func $val)

echo "The factorial of $val is: $res"

再帰的なbash関数の使用はとても簡単です!

ライブラリの作成

これで、関数の記述方法と呼び出し方法がわかりましたが、これらのbash関数またはコードのブロックをさまざまなbashスクリプトファイルで使用したい場合はどうなりますか ファイルにコピーして貼り付ける必要はありません。

関数用のライブラリを作成し、必要に応じて任意のファイルからそのライブラリを指すことができます。

ソースコマンドを使用する 、ライブラリファイルスクリプトをシェルスクリプト内に埋め込むことができます。

sourceコマンドには、dotというエイリアスがあります。 シェルスクリプトでファイルを入手するには、次の行を記述します。

. ./myscript

以下を含むmyfuncsというファイルがあると仮定します。

addnum() {

	echo $(($1 + $2 + $3 + $4))

}

次に、次のような別のbashスクリプトファイルで使用します。

#!/bin/bash

. ./myfuncs

result=$(addnum 10 10 5 5)

echo "Total = $result"

素晴らしい!! bashスクリプトファイル内でbash関数を使用しました。シェルで直接使用することもできます。

コマンドラインからBash関数を使用する

信号とジョブに関する前回の投稿を読むと、bashrcファイルで関数ファイルを取得する方法がわかるので、bashシェルから直接関数を使用できます。 。かっこいい

/ home / usernameにあるbashrcファイルを編集し、次の行を追加します:

. /home/likegeeks/Desktop/myfuncs

正しいパスを入力してください。

これで、この関数をコマンドラインで直接使用できるようになりました:

$ addnum 10 20

注:シェルからbash関数を使用するには、ログアウトしてログインする必要がある場合があります。

別の注意:組み込みコマンドのいずれかと同じように関数名を作成すると、デフォルトのコマンドが上書きされるため、注意が必要です。

投稿が気に入っていただければ幸いです。戻ってきてください。

ありがとうございます。


Linux
  1. 新しいデータベースを作成し、MySQL/MariaDBで使用します

  2. シェル変数の関数?

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

  1. Linuxシェルスクリプトで関数を定義して使用する方法

  2. Linuxでエイリアスを作成してエイリアスコマンドを使用する方法

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

  1. Bashでは、いつエイリアスを作成し、いつスクリプトを作成し、いつ関数を作成するのですか?

  2. (ターミナルベースの)Vimでメニューを作成して使用することは可能ですか?

  3. Bashスクリプトの問題– 2つのリストを比較して、3つ目のリストを作成しますか?