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

2024-10-25 08:42:00
admin
原创
212
摘要:问题描述:我有一个具有一些功能的脚本。我可以直接从命令行运行其中一个函数吗?像这样吗?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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用