我有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条件的语法
我怎样才能设法让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}" }
source ./second.sh func1 love horror func2 ball mystery
OUTPUT:
fun=love,book=horror fun2=ball,book2=mystery
你可以将你的函数定义移动到一个单独的文件中,然后用你的脚本将它们加载到脚本中. 命令,如下所示:
. /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脚本的名称
如果你定义
#!/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