[シェルスクリプト]シェルスクリプトでの関数定義の記法

2016年12月12日月曜日

bash linux unix シェルスクリプト

bashで関数を定義するには以下の3つの記法がある。

# 関数名()
func1() {
  echo 'func1'
}

# function 関数名
function func2 {
  echo 'func2'
}

# function 関数名()
function func3() {
  echo 'func3'
}

関数名の後ろに()を付けるパターンとfunctionキーワードを頭に付けるパターン、それらの組み合わせパターンだ。
どれでも動くけど、これらの内のどれを使ったほうがいいんだろうか。

いくつかのシェルで試してみよう。

$ cat func.sh
func1() {
  echo 'func1'
}

function func2 {
  echo 'func2'
}

function func3() {
  echo 'func3'
}

func1
func2
func3

$ bash -version
GNU bash, バージョン 4.2.53(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ bash func.sh
func1
func2
func3
$ bash --posix func.sh
func1
func2
func3
$ #dashのバージョンを確認する方法がわからない...
$ dash func.sh
func.sh: 5: func.sh: function: not found
func2
func.sh: 7: func.sh: Syntax error: "}" unexpected
$ ksh --version
 version         sh (AT&T Research) 93u+ 2012-08-01
$ ksh func.sh
func.sh: line 5: syntax error at line 9: `(' unexpected
$ pdksh -c 'echo $KSH_VERSION'
@(#)PD KSH v5.2.14 99/07/13.2
$ pdksh func.sh
func.sh[9]: syntax error: `(' unexpected

dashはそもそも"function"をキーワードとして扱っていない。
kshは"function 関数名"の後ろに"()"が出現することを予期していない。

func1() {
  echo 'func1'
}

func1

だけであれば、いずれもうまくいいく。

どうも、歴史的経緯としてfunctionキーワードを導入したのはkshらしい。
bashは互換性を持たせるために"function 関数名"という記法を許した。
けど、そのときに"function 関数名()"もOKにしてしまったということなのかな。

シェルは先頭のトークンをコマンドもしくは制御用のキーワードとして解釈するという考え方からすれば、functionキーワードをを使って関数宣言するのはわからなくもない。
でも、互換性を考えると、functionキーワードを使わずに"関数名()"で関数宣言したほうがいいみたい。