微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以从另一个shell脚本中调用一个shell脚本的函数吗?

我有2个shell脚本。

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

func1 func2

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

这是我正在谈论的例子

grep如何工作?

为什么bc和args不能一起工作?

Unix Diff命令比较2个txt文件的差异并生成更多的命令

如何在CentOs中启动后编辑initramfs来添加新的分区

windows子命令评估

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

我怎样才能做到这一点?

BASH:如何将parameter passing给别名:不能使用函数 – Bash条件的语法

如何在awk动作中增加一个shellvariables

我怎样才能设法让stderr消息不在控制台中打印?

在linux中合​​并两个文件而不重复

可执行while循环:没有这样的文件或目录

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

function func1 { fun=$1 book=$2 printf "fun=%s,book=%sn" "${fun}" "${book}" } function func2 { fun2=$1 book2=$2 printf "fun2=%s,book2=%sn" "${fun2}" "${book2}" }

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

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

OUTPUT:

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

您不能直接在另一个shell脚本中调用一个函数

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

. /path/to/functions.sh

这将解释functions.sh ,就好像它的内容实际上存在于你的文件中一样。 这是实现shell函数共享库的常用机制。

问题

当前接受的答案只在重要的条件下才起作用。 给定/foo/bar/first.sh

function func1 { echo "Hello $1" }

和/foo/bar/second.sh

#!/bin/bash source ./second.sh func1 World

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

cd /foo ./bar/first.sh

打印错误

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

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

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

更通用的解决方

给定/foo/bar/first.sh

function func1 { echo "Hello $1" }

和/foo/bar/second.sh

#!/bin/bash source $(dirname "$0")/second.sh func1 World

然后

cd /foo ./bar/first.sh

版画

Hello World

怎么运行的

$0返回执行脚本的相对或绝对路径

dirname返回相对路径到$ 0脚本存在的目录

$( dirname "$0" ) dirname "$0"命令将相对路径返回到已执行脚本的目录,然后将其用作source命令的参数

/second.sh只是附加了导入的shell脚本的名称

source将指定文件内容加载到当前shell

如果你定义

#!/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 Hello file2中的Hello Fun1 Hello Surprise !!! 你用file1中的fun1覆盖了file1中的fun1 …所以不要这样做

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

它保存你以前的fun1的定义,并恢复它以前的名字删除不需要导入的一个。 每次从其他文件导入函数时,您都可能记得两个方面:

你可以用相同的名称覆盖现有的(如果你想要的东西你必须如上所述保存它们)

导入导入文件的所有内容函数全局变量)要小心! 这是危险的程序

#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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐