
Bash関数は基本的に、何度も呼び出すことができるコマンドのセットです。関数の目的は、bashスクリプトを読みやすくし、同じコードを繰り返し記述しないようにすることです。ほとんどのプログラミング言語と比較して、Bash関数は多少制限されています。
このチュートリアルでは、Bash関数の基本について説明し、シェルスクリプトでそれらを使用する方法を示します。
Bash関数の定義#
bash関数を宣言するための構文は簡単です。関数は2つの異なる形式で宣言できます:
-
最初の形式は関数名で始まり、その後に括弧が続きます。これは、推奨され、より使用されている形式です。
function_name () { commands }
単一行バージョン:
function_name () { commands; }
-
2番目の形式は、予約語の
function
で始まります。 、その後に関数名が続きます。function function_name { commands }
単一行バージョン:
function function_name { commands; }
注意すべき点がいくつかあります:
- 中括弧の間のコマンド(
{}
)は関数の本体と呼ばれます。中括弧は、スペースまたは改行で本体から分離する必要があります。 - 関数を定義しても実行されません。 bash関数を呼び出すには、関数名を使用するだけです。中括弧の間のコマンドは、シェルスクリプトで関数が呼び出されるたびに実行されます。
- 関数の定義は、関数を呼び出す前に配置する必要があります。
- 1行の「圧縮された」関数を使用する場合は、セミコロン
;
関数の最後のコマンドに従う必要があります。 - 常に関数名をわかりやすくするようにしてください。
これをよりよく理解するには、次の例を見てください。
〜/ hello_world.sh#!/bin/bash
hello_world () {
echo 'hello, world'
}
hello_world
コードを1行ずつ分析してみましょう:
- 3行目では、関数に名前を付けて定義しています。中括弧
{
関数の本体の開始をマークします。 - 行
4
関数本体です。関数本体には、複数のコマンド、ステートメント、および変数宣言を含めることができます。 - 行
5
、閉じ中括弧}
、hello_world
の終わりを定義します 機能。 - インライン
7
関数を実行しています。関数は必要な回数だけ実行できます。
スクリプトを実行すると、hello, world
が出力されます。 。
変数スコープ#
グローバル変数は、スコープに関係なく、スクリプト内のどこからでもアクセスできる変数です。 Bashでは、関数内で宣言されている場合でも、デフォルトですべての変数がグローバルとして定義されています。
ローカル変数は、local
を使用して関数本体内で宣言できます。 キーワードであり、その関数内でのみ使用できます。異なる関数で同じ名前のローカル変数を持つことができます。
Bashで変数スコープがどのように機能するかをわかりやすく説明するために、次の例を考えてみましょう。
〜/ variables_scope.sh#!/bin/bash
var1='A'
var2='B'
my_function () {
local var1='C'
var2='D'
echo "Inside function: var1: $var1, var2: $var2"
}
echo "Before executing function: var1: $var1, var2: $var2"
my_function
echo "After executing function: var1: $var1, var2: $var2"
スクリプトは、2つのグローバル変数var1
を定義することから始まります。 およびvar2
。次に、ローカル変数var1
を設定する関数があります。 グローバル変数var2
を変更します 。
スクリプトを実行すると、次の出力が表示されます。
Before executing function: var1: A, var2: B
Inside function: var1: C, var2: D
After executing function: var1: A, var2: D
上記の出力から、次のように結論付けることができます。
- ローカル変数が既存のグローバル変数と同じ名前で関数本体内に設定されている場合、グローバル変数よりも優先されます。
- グローバル変数は関数内から変更できます。
戻り値#
「実際の」プログラミング言語の関数とは異なり、Bash関数では、呼び出されたときに値を返すことはできません。 bash関数が完了すると、その戻り値は、関数で実行された最後のステートメント0
のステータスになります。 成功の場合は10進数、失敗の場合は1〜255の範囲のゼロ以外の10進数。
リターンステータスは、return
を使用して指定できます。 キーワードであり、変数$?
に割り当てられます 。 return
ステートメントは関数を終了します。これは、関数の終了ステータスと考えることができます。
#!/bin/bash
my_function () {
echo "some result"
return 55
}
my_function
echo $?
some result
55
関数から実際に任意の値を返すには、他のメソッドを使用する必要があります。最も簡単なオプションは、関数の結果をグローバル変数に割り当てることです。
〜/ return_values.sh#!/bin/bash
my_function () {
func_result="some result"
}
my_function
echo $func_result
some result
関数から値を返すもう1つのより良いオプションは、値をstdout
に送信することです。 echoor printf
を使用する 以下に示すように:
#!/bin/bash
my_function () {
local func_result="some result"
echo "$func_result"
}
func_result="$(my_function)"
echo $func_result
some result
メッセージをstdoutに出力する関数を単に実行する代わりに、関数の出力をfunc_result
に割り当てます。 $()
を使用した変数 コマンド置換。変数は後で必要に応じて使用できます。
Bash関数への引数の受け渡し#
任意の数の引数をbash関数に渡すには、関数名の直後にスペースで区切って引数を置くだけです。スペースを含む引数の誤解を避けるために、引数を二重引用符で囲むことをお勧めします。
- 渡されるパラメーターは
$1
です。 、$2
、$3
…$n
、関数名の後のパラメータの位置に対応します。 -
$0
変数は関数の名前のために予約されています。 -
$#
変数は、関数に渡される位置パラメーター/引数の数を保持します。 -
$*
および$@
変数は、関数に渡されるすべての位置パラメーター/引数を保持します。- 二重引用符で囲む場合、
"$*"
スペースで区切られた単一の文字列(IFSの最初の文字)に展開されます-"$1 $2 $n"
。 - 二重引用符で囲む場合、
"$@"
個別の文字列に展開-"$1" "$2" "$n"
。 - 二重引用符で囲まれていない場合、
$*
および$@
同じです。
- 二重引用符で囲む場合、
次に例を示します:
〜/ passing_arguments.sh#!/bin/bash
greeting () {
echo "Hello $1"
}
greeting "Joe"
Hello Joe
結論#
Bash関数は、特定の操作を実行するために設計された再利用可能なコードのブロックです。定義すると、スクリプト内で関数を複数回呼び出すことができます。
また、Bash関数を使用して、より長いコマンドの印象的なショートカットコマンドを作成する方法についても読むことをお勧めします。
ご質問やご意見がございましたら、お気軽にコメントをお寄せください。