我可以调用一个shell脚本从另一个shell脚本的功能?(Can I call a functio

2019-06-25 00:28发布

我有2个shell脚本。

第二Shell脚本包含以下功能second.sh

func1 
func2

该first.sh将调用一些参数第二shell脚本,并调用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

我怎样才能实现呢?

Answer 1:

重构你的second.sh这样的脚本:

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

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

然后调用脚本,从这些功能first.sh是这样的:

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

OUTPUT:

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


Answer 2:

您不能直接调用另一个shell脚本的功能。

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

. /path/to/functions.sh

这将解释functions.sh仿佛它的内容是你的文件在这一点上实际存在。 这是用于实现功能的壳共享库的共同机制。



Answer 3:

问题

该currenly接受的答案只能在重要条件。 鉴于...

/foo/bar/first.sh

function func1 {  
   echo "Hello $1"
}

/foo/bar/second.sh

#!/bin/bash

source ./first.sh
func1 World

只有当这个工程first.sh从在同一目录下执行first.sh所在。 IE浏览器。 如果外壳的当前工作路径是/foo ,尝试运行命令

cd /foo
./bar/second.sh

打印错误:

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

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

(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只是追加进口shell脚本的名称
  • source加载内容指定的文件到当前shell


Answer 4:

如果定义

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

在文件1(CHMOD 750文件1)和file2

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

并运行./file2你会从文件1你好FUN1从文件2您好惊喜得到FUN1! 您覆盖FUN1与来自文件2 FUN1文件1 ...所以不这么做的话,必须

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

这是保存以前的定义FUN1,它除了删除不再需要以前的名称输入一个恢复。 每次你从另一个文件导入功能时,你可能还记得两个方面:

  1. 你可能会覆盖同名现有的(如果你想要的东西,你必须保持他们如上所述)
  2. 导入的导入文件的所有内容(函数和全局变量太)小心! 这是危险的程序


Answer 5:

#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


文章来源: Can I call a function of a shell script from another shell script?
标签: shell unix