UNIX/Linuxにおけるシェルではコマンドライン上で、または、関数ファイルやスクリプト内で関数を定義することができます。
コマンドライン上で作成された関数は、その場ですぐに、また関数ファイルやスクリプトファイル内で定義された関数は、カレントシェルにファイルを読み込むことで関数をUNIX/Linuxコマンドのように利用できるようになります。
ここでは、シェル関数の定義方法やファイルを利用せずコマンドラインで直接関数を定義して、すぐに使用する方法、引数を取るコマンドのような関数サンプルなどについて触れます。
bash shell function/シェル関数2では、シェル関数をファイル内に定義した場合に関数を登録、削除する方法や戻り値、スクリプトとシェル関数の関係などを見ていきます。
bashの関数はfunctionのみですが、functionを省略できるケースがあります。
bashの関数はfunctionを省略できる場合を含め、シェル関数の定義方法には大きく3通りありますが、これはスクリプトや関数ファイルだけでなく、コマンドラインからワンライナーやコマンドラインエディタからファイル名を伴うことなく定義することもできます。
最も基本的な定義は
#!/usr/bin/bash
function 関数名() {
コマンド
}
でfunctionか()のいずれか一方は省略も可なので上記の他に
#!/usr/bin/bash
関数名() {
コマンド
}
や
#!/usr/bin/bash
function 関数名 {
コマンド
}
という定義が可能で、もちろん複数シェル関数を定義したり複数のシェル関数を実行するように記述することもできます。
但し、( )を省略した関数定義で上記の書き方をした場合、関数名と { との間にスペースがないとエラーになりますから、うっかりミスをなくすためにも以下のように { の位置は改行しておく方が安全かもしれません。
#!/usr/bin/bash
function 関数名
{
コマンド
...
}
他方、他の多くのスクリプト同様、(前段のいずれかの定義方法で)コマンドを1行で記述することもでき、その場合コマンドの後にセミコロンを忘れずに
#!/usr/bin/bash
function 関数名() { コマンド ; }
#!/usr/bin/bash
function 関数名() { コマンド ; コマンド ; }
とします(セミコロンは多くのスクリプト同様、コマンドの区切り文字としても、コマンドの終わりを示す為にも使われます)。
つまり、セミコロンを利用すればコマンドラインからワンライナーで記述することも可能になり、
$ function funcdayo() { echo $0:$1:$2 ; }
例えば開始ブロックの { で[Enter]を押せば、シェルは入力の途中と判断し、コマンドラインエディタ上で続けて入力することができます(一行で複数コマンドを記述する際にはやはりセミコロンが必要です)から
$ function funcdayo() {
> echo $0:$1:$2
> }
$
となり、ワンライナーの場合には、[Enter]を押せば、コマンドラインエディタで定義している場合には開始と対になる定義ブロック終了の } の入力を終えると自動的にプロンプトに戻り、ファイルに保存することもなく定義した関数が即有効になり、
$ funcdayo 1 2
-bash:1:2
と引数を順次2つまで取るコマンドのような!?関数が、即使えるようになります。
引数を2つまでというのは$0に格納された[-bash]はコマンドラインで指定した引数ではないからです。
bashには(Perlにあるような)$1,$2,$3.....という特殊変数があり、$1以降に引数を順次自動的に引数を格納してくれるので前述の例のようにechoに特殊変数をセットすれば引数を出力します。
$0については、Perlのように実行プログラム名として[-bash]が格納され、また、引数がセットした特殊変数より多い場合、Perlのように前詰めで帳尻を合わせることはなく、第一引数から格納し、入りきらない引数は無視されます。
尚、ここのケースとは全く別に-cオプション付きでbashを起動すると$0に第一引数が格納されるとmanには書いてあります。
次のbash shell function/シェル関数2は、関数ファイルの登録・削除方法、シェル関数の戻り値やスクリプトと関数の関係などについてです。