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

AAa*_*Aaa 104 linux bash scripting

我有一个具有一些功能的脚本.

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

像这样的东西?

myScript.sh func()
Run Code Online (Sandbox Code Playgroud)

sda*_*aau 207

好吧,虽然其他答案是正确的 - 你当然可以做其他事情:如果你有权访问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
Run Code Online (Sandbox Code Playgroud)

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

# 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
Run Code Online (Sandbox Code Playgroud)

  • 在大多数情况下使用"$ @".在某些情况下,`$ @`是不安全的. (14认同)

Sve*_*ach 55

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

  • 如果有一个实际的代码示例就好了 (4认同)
  • 这种方法唯一的问题是,如果你在函数中使用 `exit`,它会在函数执行后关闭终端。有没有办法解决?@SvenMarnach (2认同)

小智 30

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

. ./myScript.sh && function_name
Run Code Online (Sandbox Code Playgroud)

  • 我可以知道为什么你的选择更简单吗?不是恶搞,是我真的不明白吗? (5认同)
  • 您也可以简单地使用源。如 - source myScript.sh && function_name (2认同)
  • @stolen_leaves 但是使用源代码有什么意义呢?您还可以使用 `sh myscript.sh && function_name`、`bash myscript.sh && function_name`、`cat myscript.sh && function_name`,这样的例子不胜枚举。但我不明白你为什么想做更长的事情。对我来说毫无意义。 (2认同)

Sor*_*gal 13

简而言之,没有.

您可以使用source(help source详细信息)将脚本中的所有函数导入到您的环境中,然后允许您调用它们.这也有执行脚本的效果,所以要小心.

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

  • 我认为这应该被赋予更多的权重作为适当的答案。我试图做一些类似于 OP 想要的东西,但是 shell 脚本根本不是为“干净的、面向对象的开发”(恕我直言)而设计的。 (2认同)

Iva*_*van 12

使用 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
Run Code Online (Sandbox Code Playgroud)

该脚本将运行函数 fun1 和 fun2,但如果您使用选项 fun1 或 fun2 启动它,它将仅运行带有 args(如果提供)的给定函数并退出。用法

$ ./test 
run function1
run function2

$ ./test fun2 a b c
run function2
options: a b c
Run Code Online (Sandbox Code Playgroud)