シェル関数に少ない引数を渡すとどうなりますか?

シェル関数に少ない引数を渡すとどうなりますか?

関数にパラメータを渡すことについて質問したいと思います。私はこれを試しました:

function_name $var1 $var2

しかし、一般的に(時には印刷エラーが発生した場合)、合格するかどうかには違いはありません。ただ呼び出すと完璧に動作することを意味しますfunction_name。だから私の質問は:上記の例のようにこれらのパラメータを提供する必要がありますか?

答え1

Cにはプロトタイプがないため、Bashは関数に渡された引数の数を確認しません。https://www.gnu.org/software/bash/manual/bash.html#Shell-Functions:

シェル関数は、グループの単一名を使用して後で実行できるようにコマンドをグループ化する方法です。これは「一般」コマンドのように実行されます。シェル関数の名前を単純なコマンド名として使用すると、その関数名に関連付けられたコマンドのリストが実行されます。シェル機能は現在シェルのコンテキストで実行され、それを解釈するための新しいプロセスは作成されません。

関数を宣言するには、次の構文を使用します。

name() 複合コマンド [リダイレクト]

または

関数名[()] 複合命令 [リダイレクト]

1つのアプローチは、関数内の複数のパラメータが正しいことを確認し、そうでない場合はエラーを返すことです。しかし、これはBashの責任ではありません。望むより:

#!/bin/bash

function f()
{
    echo $1
}

function f1
{
    echo $1
}

f
f 2
f1
f1 f1

答え2

関数が呼び出されると、コマンドラインに表示される順序で関数の引数を数値拡張として参照できます。関数を実行するためにパラメーターが必要な場合は、パラメーター拡張を使用して関連パラメーターの組み込み失敗参照を作成してこれを達成できます。

echo1()(
    printf %s\\n \
    "${1?This function requires an argument!}"
)

上記の値は印刷されます(そうであれば)関数の最初のパラメータの場合は、stdoutの改行文字に従い、0を返します。それ以外の場合は、次の構文を含むシェル形式で診断メッセージを印刷します。この関数には1つのパラメータが必要です!stderrに変換して引数がまったく指定されていない場合は、ゼロ以外の値を返します。

関数はサブシェルで実行するよう宣言されました。たとえば、次のようになります。

fn()( : body )

たとえば、現在のシェルではありません。

fn(){ : body; }

これは、エラーを発生させるために使用されるパラメータ置換形式によって現在のシェルが終了するためです。これにより、現在のシェルで関数が実行されると、現在のシェルが予期せず終了する可能性があります。これは以下にのみ適用されます。非対話型しかし、皮。たとえば、上記の関数は、関数がサブシェルで宣言されているかどうかにかかわらず、プロンプトで呼び出されると同様に機能するはずです。

echo1ただし、現在のシェルで関数を宣言してスクリプトで実行している場合は、パラメータなしでスクリプトを呼び出すと、スクリプトの実行は完全に終了します。

答え3

関数はパラメータリストを受け取る外部コマンドと同じです。本質的に、特定の数の引数を必要とする関数を定義する方法はありません。関数のコードは、引数の数とその値を確認し、必要に応じてエラーメッセージをエクスポートできます。

現在の関数に渡された引数の数は特殊変数で使用できます$#。実際のパラメーター数より大きい番号付きパラメーターを使用すると、パラメーターは設定解除され、そのパラメーターにアクセスしようとすると空の文字列が表示されます。たとえば、次の定義を使用します。

f () {
  echo "$#" "[[$2]]"
}
  • f印刷0 [[]]。 2回のパラメータがないため、$2空の文字列に展開されます。
  • f onePrint1 [[]]同じ理由で。
  • f one two印刷2 [[two]]
  • f one two three印刷3 [[two]]。関数は3番目の引数で何もしませんが、大丈夫です。

関連情報