2011-01-11 7 views
32

私はいつも彼らが何のために使用されているのだろうか? あなたが決してそれらの中に何かを置くことができない場合、毎回それらを置くように思われます。"f(){}"のようなbashシェルスクリプト関数定義で使用される括弧は何ですか?それは "function"キーワードを使うのと違うのですか?

function_name() { 
    #statements 
} 

また、関数の先頭でfunctionキーワードを入れて失う/得るためには何がありますか?

function function_name() { 
    #statements 
} 

答えて

44

キーワードfunctionは、関数が が新しい位置に 複合コマンドを呼び出すために、単純なコマンドとして使用されていることを、ユーザー定義の名前ですPOSIX spec

と移植性のためにfunction_name()の賛成で廃止されました パラメータ。関数は、 "関数定義コマンド"である で定義されています。次のように

関数定義 コマンドの形式は次のとおりです。あなたがキーワードfunctionを使用するつもりはない(とあなたはいけないので、もし{ }は必須ではありませんことを

fname() compound-command[io-redirect ...] 

は注意)場合は、()が必要です。そのため、パーサーは関数を定義していることを認識します。

例、これは法律上の関数定義と呼び出しです:functionなければ

$ myfunc() for arg; do echo "$arg"; done; myfunc foo bar 
foo 
bar 
+0

関連http://stackoverflow.com/a/14652042 –

9

最初の例では、bashが関数定義であることがわかるように空のかっこが必要です(そうでない場合は、通常のコマンドのように見えます)。 2番目の例では、functionを使用しているため、()はオプションです。

+0

をああ[OK]を、理にかなって推測、それだけでPHPあなたの中にあります括弧の中に入れることができるので、私はLinuxスクリプティングで何か似たようなことをすることができるのだろうかと不思議だった。 – Mint

+2

@Mint:カッコ内には何も入れることはできません。関数を呼び出すときには使用されませんが、引き続き関数に位置パラメータを渡すことはできます。 'foo(){echo" $ 1 "; }; foo hello' –

4

、エイリアス展開は定義時で起こります。例:function

alias a=b 
# Gets expanded to "b() { echo c; }" : 
a() { echo c; } 
b 
# => c 
# Gets expanded to b: 
a 
# => c 

しかし、エイリアス展開が定義時に発生しませんので、別名を定義「隠し」:

alias a=b 
function a { echo c; } 
b 
# => command not found 
# Gets expanded to b: 
a 
# => command not found 
unalias a 
a 
# => c 
関連する問題