我有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
我怎样才能实现呢?
重构你的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
您不能直接调用另一个shell脚本的功能。
您可以将您的函数定义成一个单独的文件,然后使用它们加载到你的脚本.
命令,如下所示:
. /path/to/functions.sh
这将解释functions.sh
仿佛它的内容是你的文件在这一点上实际存在。 这是用于实现功能的壳共享库的共同机制。
问题
该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
如果定义
#!/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,它除了删除不再需要以前的名称输入一个恢复。 每次你从另一个文件导入功能时,你可能还记得两个方面:
- 你可能会覆盖同名现有的(如果你想要的东西,你必须保持他们如上所述)
- 导入的导入文件的所有内容(函数和全局变量太)小心! 这是危险的程序
#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