零舞  ( [æ±äº¬ç†ç§‘å¤§å¦ ã‚½ãƒ¼ãƒ©ãƒ³ (Soran...
目次:
Bash関数は基本的に、何度も呼び出すことができるコマンドのセットです。 関数の目的は、bashスクリプトをより読みやすくし、同じコードを何度も何度も記述しないようにすることです。
ほとんどのプログラミング言語と比較して、Bash関数は多少制限されています。 このチュートリアルでは、Bash関数の基本を取り上げ、シェルスクリプトでそれらを使用する方法を示します。
バッシュ関数宣言
bash関数を宣言するための構文は非常に単純です。 次の2つの異なる形式で宣言できます。
-
最初の形式は関数名で始まり、その後に括弧が続きます。 これは優先され、より使用される形式です。
function_name () { commands }
単一行バージョン:
function_name () { commands; }
2番目の形式は、
function
予約語で始まり、その後に関数名が続きます。function function_name { commands }
単一行バージョン:
function function_name { commands; }
注意すべき点はほとんどありません:
- 中括弧
{}
で囲まれたコマンドリストは、関数の本体です。 関数の本体を囲む中括弧は、スペースまたは改行で本体から分離する必要があります。関数を定義しても実行されません。 bash関数を呼び出すには、単に関数名を使用します。 中括弧で囲まれたコマンドは、シェルスクリプトで関数が呼び出されるたびに実行されます。関数定義は、関数を呼び出す前に配置する必要があります;
関数の最後のコマンドに従う必要があります。関数名は常に説明的なものにしてください。
これをよりよく理解するには、次の例を見てください。
〜/ hello_world.sh
#!/bin/bash hello_world () { echo 'hello, world' } hello_world
コードを行ごとに分析してみましょう。
- 3行
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
を変更する
var2
。
Before executing function: var1: A, var2: B Inside function: var1: C, var2: D After executing function: var1: A, var2: D
上記の出力から、次のように結論付けることができます。
- 既存のグローバル変数と同じ名前で関数本体内にローカル変数を設定すると、グローバル変数よりも優先されます。グローバル変数は関数内から変更できます。
戻り値
「実際の」プログラミング言語の関数とは異なり、Bash関数では、呼び出されたときに値を返すことはできません。 bash関数が完了すると、戻り値は関数で最後に実行されたステートメントのステータス、成功の場合は
0
、失敗の場合は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
関数から値を返す別のより良いオプションは、次に示すようにechoまたは
printf
を使用して値を
stdout
に送信することです。
#!/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
です。$n
$0
変数は、関数名のために予約されています。$#
変数は、に渡される位置パラメーター/引数の数を保持します関数:$*
および$@
変数は、関数に渡されるすべての位置パラメーター/引数を保持します。- 二重引用符で囲まれた場合、
"$*"
はスペース(IFSの最初の文字)で区切られた単一の文字列-"$1 $2 $n"
"$@"
展開されます。二重引用符で囲まれた場合、"$@"
"$1" "$2" "$n"
二重引用符で囲まれていない場合、$*
と$@
は同じです。
- 二重引用符で囲まれた場合、
以下に例を示します。
〜/ passing_arguments.sh
#!/bin/bash greeting () { echo "Hello $1" } greeting "Joe"
結論
Bash関数は、特定の操作を実行するために設計された再利用可能なコードのブロックです。 定義した関数は、スクリプト内で複数回呼び出すことができます。
また、Bash関数を使用して、より長いコマンドのために記憶に残るショートカットコマンドを作成する方法について読むこともできます。
バッシュターミナル