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

2024-10-25 08:42:00
admin
原创
63
摘要:问题描述:我有一个具有一些功能的脚本。我可以直接从命令行运行其中一个函数吗?像这样吗?myScript.sh func() 解决方案 1:好吧,虽然其他答案都是正确的 - 但你当然可以做其他事情:如果你有权访问 bash 脚本,你可以修改它,并简单地在末尾放置特殊参数"$@&quot...

问题描述:

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

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

像这样吗?

myScript.sh func()

解决方案 1:

好吧,虽然其他答案都是正确的 - 但你当然可以做其他事情:如果你有权访问 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

解决方案 2:

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

解决方案 3:

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

. ./myScript.sh && function_name

解决方案 4:

简而言之,没有。

source您可以使用(了解详情)将脚本中的所有函数导入到您的环境中help source,然后您就可以调用它们。这也会执行脚本,所以要小心。

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

解决方案 5:

使用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,但如果您使用选项 fun1 或 fun2 启动它,它将仅运行带有参数的给定函数(如果提供)并退出。用法

$ ./test 
run function1
run function2

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

解决方案 6:

我遇到一种情况,我需要一个来自 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

解决方案 7:

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

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

function build() { 
  ... 
}

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

./control build

如果它在另一个文件夹内,则会出现以下情况:

another_folder/control build

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

./control.sh build

解决方案 8:

解决了帖子,但我想提一下我喜欢的解决方案。即定义一个通用的单行脚本eval_func.sh

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

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

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

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

解决方案 9:

这里的其他答案都很好,并且非常感谢,但我通常不想在会话中source执行脚本(在当前 shell 中读取并执行文件)直接修改它。

我发现编写一两行“引导”文件并运行它更方便。使测试主脚本更容易,不会对 shell 会话产生副作用,而且作为奖励,您可以加载模拟其他环境进行测试的内容。示例...

# breakfast.sh
make_donuts() { 
     echo 'donuts!'
}

make_bagels() {
     echo 'bagels!'
}
# bootstrap.sh
source 'breakfast.sh'

make_donuts

现在只需运行./bootstrap.sh。同样的想法也适用于你的python、ruby或任何脚本。

为什么有用?假设你因为某种原因使生活变得复杂,你的脚本可能会处于不同的环境中,并呈现不同的状态。例如,要么是你的终端会话,要么是云提供商的酷炫新产品。你还想使用简单的方法在终端中测试云事物。不用担心,你的引导程序可以为你加载基本状态。

# breakfast.sh
# Now it has to do slightly different things
# depending on where the script lives!

make_donuts() {
    if [[ $AWS_ENV_VAR ]]
    then
        echo '/donuts'
    elif [[ $AZURE_ENV_VAR ]]
    then
        echo 'donuts'
    else 
        echo '/keto_diet'
    fi
}

如果你让你的引导程序接受一个参数,那么你可以为你的函数加载不同的状态,仍然只需在 shell 会话中使用一行:

# bootstrap.sh
source 'breakfast.sh'

case $1 in
    AWS)
        AWS_ENV_VAR="arn::mumbo:jumbo:12345"
    ;;
    AZURE)
        AZURE_ENV_VAR="cloud::woo:_impress"
    ;;
esac

make_donuts # You could use $2 here to name the function you wanna, but careful if evaluating directly.

在终端会话中你只需输入:
./bootstrap.sh AWS
结果:
# /donuts

解决方案 10:

您可以像下面这样从命令行参数调用函数

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

定义函数后,在末尾添加 $1 以接受要调用的函数参数。假设上述代码保存在 fun.sh 中。现在您可以在命令行中调用 ./fun.sh irfan 和 ./fun.sh config 等函数。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用