【问题标题】:Can I only call a function from the terminal rather the whole bash script?我只能从终端调用一个函数而不是整个 bash 脚本吗?
【发布时间】:2021-08-13 10:55:56
【问题描述】:

我有一个看起来像这样的 bash 脚本:

#!/bin/bash

function one {
    echo "I am function one!!"
}

function two {
    echo "I am function two!!"
}

one
two

如果我只是简单地执行 bash test.sh,这两个函数都会被执行。

我想做的是从终端调用脚本,同时指定两个函数之一,然后只执行它。 也许是这样的: bash test.sh$one() 它应该只打印出来

我是功能一!!

这可能吗?如果可以,我将如何实现它?

谢谢!

===========================

编辑:根据@Waqas 的建议,我最终实现了以下对我有用的技巧:

function main {
    if [ -z "$1" ]
    then
        some commands
    # else run the given function only
    else
        $1
    fi
}
main "$@"

谢谢!!!

【问题讨论】:

  • 没有这种机制,但你可以一起破解一些东西来解析脚本并只提取一个函数。但是,正确的方法可能是在其中定义函数但不执行它们的附加文件,然后 source 该文件使函数可用或根据其参数调整脚本以使其行为不同。
  • 不是(),但是你可以简单地将函数调用替换为$@,然后像bash test.sh one一样调用

标签: linux bash terminal


【解决方案1】:

有很多方法可以编写代码以满足您的要求。我将为此编写代码的方式如下:

#!/bin/bash
    
function main {
    # If the argument is empty then run both functions else only run provided function as argument $1.
    [ -z "$1" ] && { one; two; } || $1     
}
        
function one {    
    echo "I am function one!!"    
}
    
function two {    
    echo "I am function two!!"    
}
    
main "$@"

如果您只执行脚本而不传递参数,那么两个函数都会运行,并且传递参数只有单个函数可以工作。

Example1(两个函数都会运行):bash script_name

Example2(只运行函数一):bash script_name one

Example3(只有函数二会运行):bash script_name two

【讨论】:

  • 谢谢,这是我最终实施的方法,它完全符合我的要求。我不得不稍微编辑一下代码,因为我无法让它与你引用的单行代码一起工作。
【解决方案2】:

最好将文件分开:将函数定义移动到单独的文件中,例如~/lib/testlib.src。然后你的 test.sh 就变成了

#!/bin/bash
. ~/lib/testlib.src
one
two

如果您需要交互式 shell 中的定义,请手动输入 . ~/lib/testlib.src,或者如果您希望它们始终可用,请将此语句放入您的 ~/.bashrc

【讨论】:

  • 嗨,我以前看到过这个建议。尝试将其分离为一个包含您的函数的文件,另一个是获取函数文件并从那里调用它们。为什么将所有内容都放在一个 "master" 脚本中不是 最佳 实践?
  • 做起来很乏味。要将函数包含在 shell 中,您需要获取主脚本的源代码,这意味着将执行主体(与函数定义无关)。由于我们通常不希望这样做,因此我们必须在“主”脚本中明确询问我们是否被采购。
  • @carlitobrigante:另一种选择是将整个主脚本单独用于函数的调用。这是可能的并且可能有意义,但是从设计的角度来看,您不再调用 functions,而是调用 sub commands。从技术上讲,主脚本可以以它喜欢的任何方式实现子命令,不一定通过调用函数。当您使用 gitsvn 时采用此方法。
【解决方案3】:

您可以通过在定义函数之后但在任何其他代码行之前编写 case 语句来做到这一点。

#!/bin/bash

function one {
    echo "I am function one!!"
}

function two {
    echo "I am function two!!"
}

case $1 in
  one)
    one
  ;;
  two)
    two
  ;;
  *)
    one
    two
  ;;
esac

然后可以用作:

$ ./test.sh one
# I am function one!!

$ ./test.sh two
# I am function two!!

在上面的示例中,我将脚本的主体放在 *) 选项下,但如果它更适合您的需要,您可以在调用它们的单个函数后将一)和二)选项“退出”:

case $1 in
  one)
    one
    exit 0
  ;;
  two)
    two
    exit 0
  ;;
esac

one
two

这一切都假设您没有将任何其他参数传递给脚本,并且 $1 将用于所需的功能。否则case语句会变得更复杂。

【讨论】:

  • 您好,感谢您的反馈。我最终实施了另一种解决方案,但这确实也是您分享的一个巧妙的解决方法!
猜你喜欢
  • 1970-01-01
  • 2017-05-03
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2020-08-09
  • 1970-01-01
  • 2021-12-06
相关资源
最近更新 更多