是否有可能创建类似于匿名函数的东西,其值可以分配给数组元素然后调用?我似乎无法在bash脚本中找到一种方法,但也许有一种解决方法。
答案 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;
}
}
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 "$_" )
但为什么?!?