如何调用bash函数


28

也许我正在以错误的方式看待这个问题。但是在这里,我正在尝试做。用Java完成我的大部分工作,但只是切换到UNIX(bash)环境。我正在这样做:

[~/Desktop/bashPlay]% cat myFunc
#!/bin/bash

ls2(){
        echo "Hello World"
}

ls3(){
        echo "Testing"
}

echo "this is a test"   
ls2 # this calls a function

[~/Desktop/bashPlay]% myFunc
this is a test
Hello World

但是我的文件中有两个函数,我希望能够从命令行分别调用它们。即:myFunc.ls2()甚至ls2。我知道可以将功能添加到.bashrc文件中,但是还有其他方法可以执行这些功能而不将其添加到文件中.bashrc吗?

Answers:


25

执行此操作的一种方法(涉及更多的键入)是通过source命令。要从myFunc调用一个函数,您可以使用source myFunc; ls2它,它会输出Hello World。

例如,我有一个名为say.sh

#!/bin/bash

function talk()
{
        echo "hi!"
}

现在我想talk()从命令行调用它的功能:

[john @ awesome〜] $来源say.sh; 谈论
嗨!

从另一个bash脚本调用它:

#!/bin/bash
source say.sh
talk

您还可以将它们放在单独的脚本中,并将它们添加到PATH变量中的目录中。

因此,例如,在一个名为的脚本中,hello您将拥有:

#!/bin/bash
echo "Hello World"

现在将其放在PATH的目录之一中,您可以通过运行进行查看echo $PATH。您可以根据需要将另一个目录添加到PATH中,或使用现有目录。将文件复制到此处后,请使用将其设置为可执行文件chmod +x filename


3
只是要清楚一点:您每次脚本或Shell启动时仅需源文件一次。之后,您可以根据需要多次调用该函数,而无需再次引用源文件。
暂停,直到另行通知。

5

另一种方法是创建一个名为functions.sh~/bin例如,在目录中)的脚本。

在此脚本中,您添加了所有个人功能定义(例如,每次添加功能时,便将其添加到此文件中...)

最后,您只需将source ~/bin/functions.sh行添加到.bashrc文件中。这样,您将能够从命令行调用它们,.bashrc保持整洁,并且可以在特定的地方使用自己的个人功能。


5

如果您像我一样,就不想用功能使环境混乱。您还具有一组功能,这些功能在功能上属于同一类,因此将它们放在同一脚本文件中是有意义的。(我知道一个包含多个文件的文件夹可以达到相同的目的)。这是一个可能的解决方案,允许您在脚本中调用特定函数:

$ cat functions.sh    
#!/bin/bash

ls2() {
        echo "Hello World"
}

ls3() {
        echo "Testing $*"
}

# the next line calls the function passed as the first parameter to the script.
# the remaining script arguments can be passed to this function.

$1 $2 $3 $4 $5 

$ ./functions.sh ls2    
Hello World   
$ ./functions.sh ls3    
Testing     
$ ./functions.sh ls3 first_arg    
Testing first_arg    
$

我不仅仅喜欢source它,还因为它可以处理两个不同的sh文件中两个具有相同名称的函数。我精是通过更换处理的参数的任意数量$1 $2 $3 $4 $5FUNC_CALL=$1; shift; $FUNC_CALL "$@"
查威尔伯

@ChuckWilbur:为什么要跳铁圈?只需将最后一行更改为即可"$@"。PS:您的方法实际上是错误的。最后一部分应该是"$FUNC_CALL" "$@"  (即  $FUNC_CALL应该用引号引起来)。
斯科特,

什么"$FUNC_CALL"
ctrl-alt-delor

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.