3

Unix コンソールから (シェル スクリプトで定義された) 関数を呼び出すことは可能ですか? 私は次のような機能を持っています

add ()
{
 a=$1
 b=$2
 c=`expr $a + $b`
}

これはスクリプトで定義されています"my_script.sh"。コマンドプロンプトからこの関数を呼び出す方法は?

4

1 に答える 1

7

引数を使用するには、リダイレクト演算子を適用しません。<これは、の直後に指定されたファイル<をプログラムの標準入力にリダイレクトします。args を使用するには、スクリプトで関数を呼び出す必要があります$...。または、単に関数をシェルにロードして使用することもできます。

どちらの場合も、関数の呼び出しは次のように実行されます。

add arg1 arg2

コマンド ラインを.sh使用する場合は、シェルから呼び出すことができるように、ファイルの内容 (関数定義) をロードする必要があります。この場合、ファイルは次のようになります。

#! /bin/bash
add () {    
    a=$1
    b=$2
    c=$(expr $a + $b)
    echo $c
}

そして、次のようにして、シェルで関数を使用します。

source script.sh
add 100 1000

script.sh ファイルの場合は、次を使用します。

./script.sh arg1 arg2

スクリプト ファイルの内容は次のようになります。

#! /bin/bash
add () {

    a=$1
    b=$2
    c=$(expr $a + $b)
    echo $c

}
add $1 $2

Obs : 関数定義で構文が有効ではありませんでした。評価の結果を代入するには、式を受け入れる必要があります。式を評価するための構文は、cmdまたは $(cmd) のいずれかですが、最初のアプローチではネスト呼び出しが許可されないという違いがあります。

複数の関数が定義されている場合は、関数呼び出しごとに引数を設定するか、単に関数を定義して「source script.sh」でシェルにロードすることができます。

関数をロードしたので、関数を 1 つずつ定義した場合と同様に呼び出す必要があります。関数内の引数は、C の古典的な「argv[]」パラメーターに対応し、関数呼び出しに固有です。

たとえば、add 関数と sub 関数を定義する場合は、次のようになります。

#! /bin/bash
add () {
    a=$1
    b=$2
    c=$(expr $a + $b)
    echo $c
}
add $1 $2

sub() {
    a=$1
    b=$2
    c=$(expr $a - $b)
    echo $c
}
sub $3 $4

または、任意の引数番号がアプリケーションに適合する可能性があります。

ただし、変数の「セマンティック」を見失う可能性があることに注意してください。これは、呼び出しが実行されるたびに変数定義をシャドウする bash スクリプトの動的スコープが原因である可能性があります。

これの簡単な例は for ループです。次のように定義された add 関数を考えてみましょう。

add () {
    let i=$1 + $2
}

そして for ループは次のように実行されます:

for (( i = 0; i < 10; i++ )); do
    echo $i
    add i 5
    echo $i
done

出力は次のとおりです。

0
5
6
11

変数 "i" は、for ループ中に "i++" だけでなく、"i" がそのスコープで使用されている関数 "add" によって変更されているためです。

于 2012-11-21T00:02:41.720 に答える