如何在命令行中从脚本运行函数?

时间:2012-01-11 11:01:09

标签: linux bash scripting

我有一个有一些功能的脚本。

我可以直接从命令行运行其中一个函数吗?

这样的东西?

myScript.sh func()

9 个答案:

答案 0 :(得分:183)

嗯,虽然其他答案是正确的 - 你当然可以做其他事情:如果你有权访问bash脚本,你可以修改它,只需在最后放置特殊参数"$@" - 这将是扩展到您指定的命令行的参数,因为它是“单独”的,shell将尝试逐字调用它们;在这里你可以指定函数名作为第一个参数。示例:

$ cat test.sh
testA() {
  echo "TEST A $1";
}

testB() {
  echo "TEST B $2";
}

"$@"


$ bash test.sh
$ bash test.sh testA
TEST A 
$ bash test.sh testA arg1 arg2
TEST A arg1
$ bash test.sh testB arg1 arg2
TEST B arg2

对于抛光,您可以先验证命令是否存在且是否为函数:

# Check if the function exists (bash specific)
if declare -f "$1" > /dev/null
then
  # call arguments verbatim
  "$@"
else
  # Show a helpful error
  echo "'$1' is not a known function name" >&2
  exit 1
fi

答案 1 :(得分:48)

如果脚本只定义了函数而不执行任何其他操作,则可以先使用source.命令在当前shell的上下文中执行脚本,然后只需调用该函数。有关详细信息,请参阅help source

答案 2 :(得分:23)

以下命令首先在上下文中注册该函数,然后调用它:

. ./myScript.sh && function_name

答案 3 :(得分:12)

简单地说,没有。

您可以使用sourcehelp source获取详细信息)将脚本中的所有功能导入您的环境,然后您可以调用它们。这也有执行脚本的效果,所以要小心。

无法从shell脚本调用函数,就像它是共享库一样。

答案 4 :(得分:6)

使用case

#!/bin/bash

fun1 () {
    echo "run function1"
    [[ "$@" ]] && echo "options: $@"
}

fun2 () {
    echo "run function2"
    [[ "$@" ]] && echo "options: $@"
}

case $1 in
    fun1) "$@"; exit;;
    fun2) "$@"; exit;;
esac

fun1
fun2

此脚本将运行fun1和fun2函数,但是如果您使用option来启动它 fun1或fun2只会使用args(如果提供)运行给定的函数并退出。 用法

$ ./test 
run function1
run function2

$ ./test fun2 a b c
run function2
options: a b c

答案 5 :(得分:1)

我的情况是我需要一个来自bash脚本的函数,以前不能执行该函数(例如source),@$的问题是myScript.sh然后运行两次,它似乎......所以我想出了用sed获取功能的想法:

sed -n "/^func ()/,/^}/p" myScript.sh

要在我需要的时候执行它,我把它放在一个文件中并使用source

sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh

答案 6 :(得分:0)

编辑:警告 - 似乎这并不适用于所有情况,但在许多公共脚本上运行良好。

如果您有一个名为“control”的bash脚本,并且在其中有一个名为“build”的函数:

function build() { 
  ... 
}

然后你可以这样调用它(从它所在的目录):

./control build

如果它在另一个文件夹中,那就可以了:

another_folder/control build

如果您的文件名为“control.sh”,那么这将使该函数可调用如下:

./control.sh build

答案 7 :(得分:0)

已解决的帖子,但我想提及我的首选解决方案。即,定义通用的单行脚本eval_func.sh

#!/bin/bash
source $1 && shift && "@a"

然后通过以下命令调用任何脚本中的任何函数:

./eval_func.sh <any script> <any function> <any args>...

我接受的解决方案遇到的一个问题是,当在另一个脚本中提供包含函数的脚本时,后者的参数将由前者评估,从而导致错误。

答案 8 :(得分:-1)

您可以从如下所示的命令行参数中调用函数

function irfan() {
echo "Irfan khan"
date
hostname
}
function config() {
ifconfig
echo "hey"
}
$1

函数结束后将$ 1接受参数 假设上面的代码保存在fun.sh中以运行功能 ./fun.sh irfan和./fun.sh配置