shell脚本中的匿名函数

时间:2011-12-08 08:09:17

标签: bash shell

是否有可能创建类似于匿名函数的东西,其值可以分配给数组元素然后调用?我似乎无法在bash脚本中找到一种方法,但也许有一种解决方法。

6 个答案:

答案 0 :(得分:53)

简短回答:不。

答案很长:Nooooooooooooo。

完整答案:bash中的函数不是第一类对象,因此bash中不存在匿名函数。

答案 1 :(得分:8)

如果您确实需要数组来存储函数,则可以定义命名函数并仅存储它们的名称。然后,您可以将该函数调用为${array[n]}。或者,您可以为他们命名func1 .. funcN,然后只需致电func$n

答案 2 :(得分:8)

有可能;我写了一个库来完成这个,虽然这是一个非常奇怪的项目。源代码位于http://github.com/spencertipping/bash-lambda。使用此库:

$ my_array=()
$ my_array[0]=$(fn x 'echo $((x + 1))')
$ my_array[1]=$(fn x 'echo $((x + 2))')
$ ${my_array[0]} 5
6
$ ${my_array[1]} 5
7
$

诀窍是让fn函数创建一个包含函数体的文件,chmod +x该文件,然后返回其名称。这会导致杂散文件累积,这就是库也实现异步标记/清除垃圾收集器的原因。

答案 3 :(得分:6)

常用技术是有条件地分配函数定义:

#!/bin/sh

case $1 in
a) foo() { echo case a; };;
b) foo() { echo case b; };;
*) foo() { echo default; } ;;
esac

foo

答案 4 :(得分:0)

[DataContract] public class Person() { [DataMember] public string Age{get; set;} [DataMember] public string Path{get; set;} public Person(string age, string path) { this.Age = age; this.Path = path; } }

中创建fn文件
PATH

然后你可以这样做:

#!/bin/sh

printusage () {
        printf "Create anonymous function, for example\n"
        printf "fn 'echo "$1 $2"'"
        exit 1
}


[ "$#" = "1" ] || printusage
fun=$1
[ "$fun" = "" ] && printusage
fun_file="$(mktemp /tmp/fun_XXXXXX)"

echo "#!/bin/sh" > "$fun_file"
echo "" >> "$fun_file"
echo "$fun" >> "$fun_file"
chmod u+x "$fun_file"

echo "$fun_file"

答案 5 :(得分:0)

好的bash是图灵完成的,所以完全可能;)

但除此之外,它不值得考虑。

你可以通过这一行来模拟这种行为:

echo myval ; ( foocmd "$_" && barcmd "$_" )

但为什么?!?