lambda函数在bash中

时间:2009-01-15 19:30:37

标签: bash lambda

有没有办法在bash中实现/使用lambda函数?我想的是:

$ someCommand | xargs -L1 (lambda function)

7 个答案:

答案 0 :(得分:21)

我不知道如何做到这一点,但是你可能能够完成你想要做的事情:

somecommand | while read -r; do echo "Something with $REPLY"; done

这也会更快,因为您不会为每行文本创建新流程。

[编辑2009-07-09] 我做了两处改动:

  1. 注意litb建议使用-r禁用反斜杠处理 - 这意味着输入中的反斜杠将保持不变。
  2. 代替供给变量名称(例如X)作为参数来read,我们让read分配给它的默认变量,REPLY。这具有保留前导和尾随空间的令人愉快的副作用,否则将被剥离(即使内部空间被保留)。
  3. 根据我的观察,这些更改一起保留了除每个输入行上的文字NUL(ASCII 0)字符之外的所有内容。

    [编辑26/7/2016]

    据评论者Evi1M4chine,运行$IFS(例如,使用命令read X)也应在开始和结束时保留的空间之前设定IFS='' read X为空字符串存储结果时进入$X,意味着您不必使用$REPLY

答案 1 :(得分:9)

如果你想要真正的函数,而不仅仅是管道或while循环(例如,如果你想传递它们,就像它们是数据一样)我不会做lambdas,并定义具有重复虚拟名称的虚函数,立即使用,然后扔掉。像这样:

# An example map function, to use in the example below.
map() { local f="$1"; shift; for i in "$@"; do "$f" "$i"; done; }

# Lambda function [λ], passed to the map function.
λ(){ echo "Lambda sees $1"; }; map λ *

与正确的函数式语言一样,不需要传递参数,因为您可以将它们包装在闭包中:

# Let’s say you have a function with three parameters
# that you want to use as a lambda:
# (As in: Partial function application.)
trio(){ echo "$1 Lambda sees $3 $2"; }

# And there are two values that you want to use to parametrize a
# function that shall be your lambda.
pre="<<<"
post=">>>"

# Then you’d just wrap them in a closure, and be done with it:
λ(){ trio "$pre" "$post" "$@"; }; map λ *

我认为它比这里提出的所有其他解决方案都要短。

答案 2 :(得分:3)

这个怎么样?

somecommand | xargs -d"\n" -I{} echo "the argument is: {}"

(假设每个参数都是一行,否则更改分隔符)

答案 3 :(得分:1)

如果你只想要xargs(例如并行-P N选项),并且只将bash作为函数代码,那么bash -c可以用作xargs的参数。

seq 1 10 | tr '\n' '\0' | xargs -0 -n 1 bash -c 'echo any bash code $0'

tr和-0选项用于禁用任何xargs参数替换。

答案 4 :(得分:1)

已经提到了评估技巧,但这是我对bash闭包的扩展示例:

#!/usr/bin/env bash

set -e

function multiplyBy() {
    X="$1"

    cat <<-EOF
        Y="\$1"
        echo "$X * \$Y = \$(( $X * \$Y ))"
    EOF
}

function callFunc() {
    CODE="$1"
    shift

    eval "$CODE"
}

MULT_BY_2=`multiplyBy 2`
MULT_BY_4=`multiplyBy 4`

callFunc "$MULT_BY_2" 10
callFunc "$MULT_BY_4" 10

PS我刚刚出于完全不同的目的提出了这个建议,只是在搜索google以查看sb是否正在使用它。 我实际上需要在主脚本的上下文(外壳)中评估可重用的功能。

答案 5 :(得分:0)

是。可以传递表示命令调用的字符串变量,然后使用eval执行命令。

示例:

command='echo howdy'
eval "$command"

答案 6 :(得分:0)

#!/bin/bash

function customFunction() {
    eval $1
}

command='echo Hello World; echo Welcome;'
customFunction "$command"

GL

Source