关于unix:我可以从另一个shell脚本调用shell脚本的函数吗?

Can I call a function of a shell script from another shell script?

我有两个shell脚本。

第二个shell脚本包含以下函数第二

1
2
func1
func2

first.sh将使用一些参数调用第二个shell脚本,并将使用特定于该函数的一些其他参数调用func1和func2。

下面是我所说的例子

第二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
val1=`echo $1`
val2=`echo $2`

function func1 {

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

}

function func2 {

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


}

第一。

1
2
3
4
second.sh cricket football

func1 love horror
func2 ball mystery

我怎样才能做到?


像这样重构您的second.sh脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
function func1 {
   fun=$1
   book=$2
   printf"fun=%s,book=%s
""${fun}""${book}"
}

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

然后从脚本first.sh调用这些函数,如下所示:

1
2
3
source ./second.sh
func1 love horror
func2 ball mystery

输出:

1
2
fun=love,book=horror
fun2=ball,book2=mystery


不能直接调用另一个shell脚本中的函数。

您可以将函数定义移动到单独的文件中,然后使用.命令将它们加载到脚本中,如下所示:

1
. /path/to/functions.sh

这将把functions.sh解释为它的内容在此时实际存在于您的文件中。这是实现shell函数共享库的常见机制。


问题

目前接受的答案只在重要条件下有效。鉴于。。。

/foo/bar/first.sh

1
2
3
function func1 {  
   echo"Hello $1"
}

/foo/bar/second.sh

1
2
3
4
#!/bin/bash

source ./first.sh
func1 World

只有当first.shfirst.sh所在的同一目录中执行时,此操作才有效。即,如果shell当前的工作路径是/foo,则尝试运行命令

1
2
cd /foo
./bar/second.sh

打印错误:

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

这是因为source ./first.sh相对于当前工作路径,而不是脚本的路径。因此,一种解决方案可能是使用子shell并运行

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

更通用的解决方案

鉴于。。。

/foo/bar/first.sh

1
2
3
function func1 {  
   echo"Hello $1"
}

/foo/bar/second.sh

1
2
3
4
5
#!/bin/bash

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

func1 World

然后

1
2
cd /foo
./bar/second.sh

印刷品

1
Hello World

它是如何工作的

  • $0返回执行脚本的相对或绝对路径
  • dirname返回存在$0脚本的目录的相对路径。
  • $( dirname"$0" )dirname"$0"命令返回相对已执行脚本的目录路径,然后用作source命令的参数
  • 在"second.sh"中,/first.sh只是附加了导入的shell脚本的名称。
  • source将指定文件的内容加载到当前壳

如果你定义

1
2
3
4
5
6
7
8
    #!/bin/bash
        fun1(){
          echo"Fun1 from file1 $1"
        }
fun1 Hello
. file2
fun1 Hello
exit 0

文件1(chmod 750文件1)文件2

1
2
3
4
5
6
   fun1(){
      echo"Fun1 from file2 $1"
    }
    fun2(){
      echo"Fun1 from file1 $1"
    }

然后跑。/文件2你会得到来自文件1的fun1你好来自文件的fun1你好惊喜!!!!用文件2中的fun1覆盖文件1中的fun1…为了不这样做,你必须

1
2
3
4
5
6
declare -f pr_fun1=$fun1
. file2
unset -f fun1
fun1=$pr_fun1
unset -f pr_fun1
fun1 Hello

它将保存您以前对fun1的定义,并用以前的名称还原,删除不需要导入的名称。每次从另一个文件导入函数时,您可能会记住两个方面:

  • 您可以用相同的名称覆盖现有的名称(如果您想要这样做,您必须按照上面的描述保留它们)
  • 导入导入文件的所有内容(函数和全局变量也是如此)小心!这是危险的程序

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #vi function.sh

       #!/bin/bash
    `enter code here`f1()

        {
    echo"Hello $name"
    }
    f2(){
    echo"Enter your name:"
    read name
    f1
    }
    f2
    #sh function.sh
    Here function 2 will call function 1