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 |
我怎样才能做到?
像这样重构您的
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}" } |
然后从脚本
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 |
这将把
问题
目前接受的答案只在重要条件下有效。鉴于。。。
1 2 3 | function func1 { echo"Hello $1" } |
和
1 2 3 4 | #!/bin/bash source ./first.sh func1 World |
只有当
1 2 | cd /foo ./bar/second.sh |
打印错误:
1 | /foo/bar/second.sh: line 4: func1: command not found |
这是因为
1 | (cd /foo/bar; ./second.sh) |
更通用的解决方案
鉴于。。。
1 2 3 | function func1 { echo"Hello $1" } |
和
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 |