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

2024-10-25 08:42:00
admin
原创
227
摘要:问题描述:我有一个具有一些功能的脚本。我可以直接从命令行运行其中一个函数吗?像这样吗?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 等函数。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2599  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1556  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   38  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   32  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   28  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用