在 bash 中实现匿名函数是否可行(必要时甚至使用 eval)?

hel*_*hod 5 bash

由于 bash 没有一流的函数,我通过将字符串传递给函数来模拟匿名函数,然后由eval.

it() {
    echo "$1" # prints the description of the spec
    beforeEach # a setup function
    eval "$2"

    if (($? == 0)); then
        # do something
    fi

    afterEach  # a cleanup function
}

it "should echo something" '{
  echo "something"
}'
Run Code Online (Sandbox Code Playgroud)

这允许编写非常简洁的测试(它定义了规范)。现在我想知道这是否是 eval 的有效用法。

编辑

我知道匿名函数字符串中不需要开头 { 和结尾 } ,它就像 Jasmine 这样的东西。

编辑

pseudo anonymous function实际上是一个测试,这意味着在测试结束时,有类似的东西

[[ var == 'foo' ]]
Run Code Online (Sandbox Code Playgroud)

或者

((i > 10))
Run Code Online (Sandbox Code Playgroud)

即某种测试(或断言,在 XUnit 术语中)。除了然后被评估的返回码之外,它永远不需要返回任何东西,如果返回码为 0(成功),则描述以绿色打印,否则为红色(测试失败)。

jwf*_*arn 6

对于一次性使用的“匿名”函数,我使用以下约定在函数作用域中执行 bash 脚本:

#!/usr/bin/env bash
_() {
  #...
} && _ "$@"
unset -f _
Run Code Online (Sandbox Code Playgroud)

虽然不是真正的匿名,但这类似于JavaScript 中的IIFE(立即调用函数表达式)习惯用法。

Bash 函数必须有一个名称。您可以使用任何您喜欢的名称(main这是一个流行的选择。)我更喜欢单个下划线_,因为 a) 它很短 b) 它通常在许多语言中用于指示一次性值。


tri*_*eee 1

如果它能完成工作,并且您(最好是其他人)完全了解它是如何工作的。

我已经不止一次或两次为测试用例自动化编写类似的代码,但我承认它可能会变得非常复杂,特别是如果你从简单开始,然后让它有机增长。

不管怎样,我想建议在风格上进行改进;

if eval "$2"; then
  # something
Run Code Online (Sandbox Code Playgroud)

或者如果“某事”是一个简单的命令,普通的旧命令

eval "$2" && # something
Run Code Online (Sandbox Code Playgroud)

话虽如此,如果您可以完全避免这种情况可能会更好eval,但这取决于您的测试用例。

$2 && # something
Run Code Online (Sandbox Code Playgroud)