111

2つのシェルスクリプトがあります。

2番目のシェルスクリプトには、次の関数 second.shが含まれています

func1 
func2

first.shは、いくつかのパラメーターを使用して2番目のシェルスクリプトを呼び出し、その関数に固有の他のいくつかのパラメーターを使用してfunc1およびfunc2を呼び出します。

これが私が話していることの例です

second.sh

val1=`echo $1`
val2=`echo $2`

function func1 {

fun=`echo $1`
book=`echo $2`

}

function func2 {

fun2=`echo $1`
book2=`echo $2`


}

first.sh

second.sh cricket football

func1 love horror
func2 ball mystery

どうすればそれを達成できますか?

4

7 に答える 7

171

second.sh次のようにスクリプトをリファクタリングします。

func1 {
   fun="$1"
   book="$2"
   printf "func=%s,book=%s\n" "$fun" "$book"
}

func2 {
   fun2="$1"
   book2="$2"
   printf "func2=%s,book2=%s\n" "$fun2" "$book2"
}

first.sh次に、次のようなスクリプトからこれらの関数を呼び出します。

source ./second.sh
func1 love horror
func2 ball mystery

出力:

func=love,book=horror
func2=ball,book2=mystery
于 2012-05-30T19:47:42.443 に答える
63

別のシェルスクリプトで関数を直接呼び出すことはできません。

関数定義を別のファイルに移動し、.次のようにコマンドを使用してスクリプトにロードできます。

. /path/to/functions.sh

functions.shこれは、そのコンテンツがこの時点で実際にファイルに存在しているかのように解釈されます。これは、シェル関数の共有ライブラリを実装するための一般的なメカニズムです。

于 2012-05-30T19:21:42.467 に答える
36

問題

現在受け入れられている回答は、重要な条件下でのみ機能します。与えられた...

/foo/bar/first.sh

function func1 {  
   echo "Hello $1"
}

/foo/bar/second.sh

#!/bin/bash

source ./first.sh
func1 World

これは、が配置first.shされているのと同じディレクトリ内からが実行された場合にのみ機能しfirst.shます。つまり。シェルの現在の作業パスがである場合、/fooコマンドを実行しようとします

cd /foo
./bar/second.sh

エラーを出力します:

/foo/bar/second.sh: line 4: func1: command not found

これsource ./first.shは、がスクリプトのパスではなく、現在の作業パスに関連しているためです。したがって、1つの解決策は、サブシェルを利用して実行することです。

(cd /foo/bar; ./second.sh)

より一般的なソリューション

与えられた...

/foo/bar/first.sh

function func1 {  
   echo "Hello $1"
}

/foo/bar/second.sh

#!/bin/bash

source $(dirname "$0")/first.sh

func1 World

それから

cd /foo
./bar/second.sh

プリント

Hello World

使い方

  • $0実行されたスクリプトへの相対パスまたは絶対パスを返します
  • dirname$0スクリプトが存在するディレクトリへの相対パスを返します
  • $( dirname "$0" )コマンドは、実行されたスクリプトのディレクトリへの相対パスを返します。これは、コマンドdirname "$0"の引数として使用されます。source
  • 「second.sh」に、/first.shインポートされたシェルスクリプトの名前を追加するだけです
  • source指定されたファイルのコンテンツを現在のシェルにロードします
于 2017-02-07T22:22:47.203 に答える
2

second.sh

#!/bin/bash

function func1() {
   fun="$1"
   book="$2"
   echo "$fun, $book\n"
}

function func2() {
   fun2="$1"
   book2="$2"
   printf "$fun2, $book2\n"
}

first.sh

#!/bin/bash

source /absolute_path_to/second.sh
func1 love horror
func2 ball mystery

あなたはそれを使用する前にあなたの心にこれらのことを覚えておく必要があります

  • キーワードsource.(ピリオド)は同じコマンドです。
  • FILENAMEがファイルへのフルパスでない場合、コマンドは$PATH環境変数で指定されたディレクトリでファイルを検索します。にファイルが見つからない場合、$PATHコマンドは現在のディレクトリでファイルを検索します。
  • いずれかARGUMENTSが指定されている場合、それらはの位置パラメータになりFILENAMEます。
  • 存在する場合FILENAME、ソースコマンドの終了コードはです0。そうでない場合、ファイルが見つからない場合は、を返し1ます。

これらのポイントの中で焦点を当てるべきポイントは1つです。使用している場合は、second実際にABSOLUTE_PATHファイルにを提供する必要があります。それがあなたの場合は機能しません。その後、私の友人はパスを変更する必要があります。。#!/bin/bashRELATIVE_PATHABSOLUTE_FILE_PATH

于 2021-05-17T14:15:50.317 に答える
0

定義する場合

    #!/bin/bash
        fun1(){
          echo "Fun1 from file1 $1"
        }
fun1 Hello
. file2 
fun1 Hello
exit 0

file1(chmod 750 file1)およびfile2内

   fun1(){
      echo "Fun1 from file2 $1"
    }
    fun2(){
      echo "Fun1 from file1 $1"
    }

./file2を実行すると、file1からFun1が取得されます。file2からHelloFun1が取得されます。HelloSurprise!!! file1のfun1をfile2のfun1で上書きします...そうしないようにするには、

declare -f pr_fun1=$fun1
. file2
unset -f fun1
fun1=$pr_fun1
unset -f pr_fun1
fun1 Hello

fun1の以前の定義を保存し、インポートされた不要なインポートされた名前を削除して以前の名前で復元します。別のファイルから関数をインポートするたびに、次の2つの側面を覚えているかもしれません。

  1. 既存のものを同じ名前で上書きすることができます(必要なものが上記のように保存する必要がある場合)
  2. インポートファイルのすべてのコンテンツをインポートします(関数とグローバル変数も)注意してください!危険な手順です
于 2017-08-19T18:37:51.770 に答える
0

これは非常に古い投稿です、私は知っています。しかし、同じディレクトリにあるにもかかわらず、別のファイルを入手できないことがわかりました。

line 3: ./functions.bash: No such file or directory

次に、iniファイルからインポートするため、この正確な状況に対応するメソッドをすでに用意していることを思い出しました。これが、パスをハードコーディングせずにどこからでも(そして明らかにソースファイルから)プログラムを実行できるようにする私のソリューションです。

app="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
source $app/functions.bash

私はこれを信用することができません、それはしばらくの間です、そして私がどこからラインを手に入れたのか思い出せません、さもなければ私はそれらを信用するでしょう、しかしそれは私がファイルを調達するために使うすべてです。

于 2021-08-27T16:12:32.680 に答える
-6
#vi function.sh

#!/bin/bash
f1() {
    echo "Hello $name"
}

f2() {
    echo "Enter your name: "
    read name
    f1
}
f2

#sh function.sh

ここで関数は関数f2を呼び出しますf1

于 2013-09-11T16:00:20.250 に答える