Bash 関数

この章では、Bash 関数の使用法を紹介します。

導入

関数は再利用可能なコードの一部であるため、コードの再利用が容易になります。エイリアスとの違いは、エイリアスは単純な単一コマンドのカプセル化にのみ適しているのに対し、関数は複雑な複数行のコマンドをカプセル化できることです。

関数は常に現在のシェルで実行されます。これは、スクリプトを実行するために新しいサブシェルを作成する Bash との大きな違いです。関数がスクリプトと同じ名前の場合、その関数が最初に実行されます。ただし、関数の優先順位はエイリアスの優先順位ほど高くありません。つまり、関数がエイリアスと同じ名前を持つ場合、エイリアスが最初に実行されます。

Bash 関数定義には 2 つの構文があります。

# 最初のタイプ
fn() {
  #コード
}

# 2 番目のタイプ
関数 fn() {
  #コード
}

上記のコードでは、「fn」はカスタム関数名であり、関数コードは中括弧内に記述されています。これら 2 つの書き方は同等です。

以下は簡単な関数の例です。

こんにちは() {
  エコー「こんにちは$1」
}

上記のコードでは、関数本体の $1 は、関数が呼び出されたときの最初のパラメーターを表します。

呼び出すときは、関数名を直接記述するだけで、関数名の後にパラメータが続きます。

$ハローワールド
こんにちは世界

以下は、現在の日付と時刻を表示する複数行の関数の例です。

今日() {
  echo -n "今日の日付は次のとおりです。"
  日付 +"%A、%B %-d、%Y"
}

関数を削除するには、「unset」コマンドを使用します。

unset -f 関数名

現在のシェルで定義されているすべての関数を表示するには、declare コマンドを使用します。

$ 宣言 -f

上記の declare コマンドは関数名だけでなくすべての定義も出力します。出力順序は関数名のアルファベット順です。大量のコンテンツが出力されるため、パイプライン コマンドを「more」または「less」で使用するのが最善です。

declare コマンドは、単一関数の定義の表示もサポートしています。

$ 宣言 -f 関数名

declare -F は、関数本体を除く、定義されたすべての関数名を出力できます。

$ 宣言 -F

パラメータ変数

パラメーター変数を関数本体内で使用して、関数パラメーターを取得できます。関数のパラメータ変数は、スクリプトのパラメータ変数と一致します。

  • $1~$9: 関数の最初から 9 番目のパラメータ。
  • $0: 関数が配置されているスクリプトの名前。
  • $#: 関数のパラメータの総数。
  • $@: スペースで区切られた関数のすべてのパラメータ。
  • $*: 関数のすべてのパラメーター。パラメーターは変数 $IFS 値の最初の文字で区切られます。デフォルトはスペースですが、カスタマイズできます。

関数に 9 個を超えるパラメーターがある場合、10 番目のパラメーターは ${10} などの形式で参照できます。

以下はサンプルスクリプトtest.shです。

#!/bin/bash
#test.sh

関数アリス {
  エコー「アリス:$@」
  エコー「$0: $1 $2 $3 $4」
  エコー「$# 引数」

}

不思議の国のアリス

スクリプトを実行すると、結果は次のようになります。

$ bash テスト.sh
アリス: 不思議の国のアリス
test.sh: 不思議の国で
2 つの引数

上記の例では、関数 alice には 1 番目と 2 番目のパラメータしかないため、3 番目と 4 番目のパラメータは空です。

以下はログ関数の例です。

関数 log_msg {
  echo "[`日付 '+ %F %T'` ]: $@"
}

使い方は以下の通りです。

$ log_msg "これはサンプルのログメッセージです"
[2018-08-16 19:56:34]: これはサンプルのログメッセージです

コマンドを返す

「return」コマンドは関数から値を返すために使用されます。関数がこのコマンドを実行すると、実行されなくなり、直接返されます。

関数 func_return_value {
  10を返す
}

関数は呼び出し元に戻り値を返します。コマンドラインが関数を直接実行する場合、次のコマンドは $? を使用して戻り値を取得できます。

$func_return_value
$ echo "関数によって返される値は次のとおりです: $?"
関数によって返される値は次のとおりです: 10

return の後にはパラメータは続かず、リターンにのみ使用されます。

関数名 {
  コマンド
  戻る
}

グローバル変数とローカル変数、ローカルコマンド

Bash 関数の本体内で直接宣言された変数はグローバル変数であり、スクリプト全体で読み取ることができます。これには特別な注意が必要です。

# test.sh をスクリプト化する
fn () {
  foo=1
  エコー「fn: foo = $foo」
}

ふん
エコー「グローバル: foo = $foo

上記のスクリプトを実行した結果は次のようになります。

$ bash テスト.sh
fn: foo = 1
グローバル: foo = 1

上記の例では、変数 $foo が関数 fn 内で宣言されており、関数本体の外部から読み取ることもできます。

グローバル変数は関数本体内で宣言できるだけでなく、変更することもできます。

#!/bin/bash
foo=1

fn () {
  foo=2
}

ふん

エコー $foo

上記のコードを実行すると、出力変数 $foo の値は 2 になります。

ローカル変数は、関数内で「local」コマンドを使用して宣言できます。

#!/bin/bash
# test.sh をスクリプト化する
fn () {
  ローカルフー
  foo=1
  エコー「fn: foo = $foo」
}

ふん
エコー「グローバル: foo = $foo

上記のスクリプトを実行した結果は次のようになります。

$ bash テスト.sh
fn: foo = 1
グローバル: foo =

上記の例では、local コマンドによって宣言された $foo 変数は関数本体内でのみ有効であり、関数本体の外では定義されません。

参考リンク


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0