有没有办法在bash中实现/使用lambda函数?我想的是:
$ someCommand | xargs -L1 (lambda function)
答案 0 :(得分:21)
我不知道如何做到这一点,但是你可能能够完成你想要做的事情:
somecommand | while read -r; do echo "Something with $REPLY"; done
这也会更快,因为您不会为每行文本创建新流程。
[编辑2009-07-09] 我做了两处改动:
-r
禁用反斜杠处理 - 这意味着输入中的反斜杠将保持不变。X
)作为参数来read
,我们让read
分配给它的默认变量,REPLY
。这具有保留前导和尾随空间的令人愉快的副作用,否则将被剥离(即使内部空间被保留)。根据我的观察,这些更改一起保留了除每个输入行上的文字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