Unix コンソールから (シェル スクリプトで定義された) 関数を呼び出すことは可能ですか? 私は次のような機能を持っています
add ()
{
a=$1
b=$2
c=`expr $a + $b`
}
これはスクリプトで定義されています"my_script.sh"
。コマンドプロンプトからこの関数を呼び出す方法は?
引数を使用するには、リダイレクト演算子を適用しません。<
これは、の直後に指定されたファイル<
をプログラムの標準入力にリダイレクトします。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" によって変更されているためです。