【发布时间】:2011-12-08 08:09:16
【问题描述】:
是否可以创建类似于匿名函数的东西,其值可以分配给数组元素并在以后调用?我似乎找不到在 bash 脚本中执行此操作的方法,但也许有一种解决方法。
【问题讨论】:
是否可以创建类似于匿名函数的东西,其值可以分配给数组元素并在以后调用?我似乎找不到在 bash 脚本中执行此操作的方法,但也许有一种解决方法。
【问题讨论】:
简短回答:不。
长答案:Nooooooooooooo。
完整答案:bash 中的函数不是一等对象,因此 bash 中不可能有匿名函数。
【讨论】:
eval数组元素。
有可能;我写了一个库来做到这一点,虽然这是一个非常奇怪的项目。源代码位于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 该文件,然后返回其名称。这会导致杂散文件堆积,这就是库还实现异步标记/清除垃圾收集器的原因。
【讨论】:
some_command; ${my_array[0]} 5,或者some_command && ${my_array[0]} 5,这两个表达式都只会在运行some_command之后运行"${my_array[0]} 5。
常用的技术是有条件地分配函数定义:
#!/bin/sh 案例 1 美元 a) foo() { echo case a; };; b) foo() { echo case b; };; *) foo() { 回显默认值; } ;; 经社理事会 富【讨论】:
如果你真的需要数组来存储函数,你可以定义命名函数并只存储它们的名字。然后,您可以将该函数称为${array[n]}。或者,您可以将它们命名为func1 .. funcN,然后直接调用func$n。
【讨论】:
declare -n reference_name - 不是匿名的,但名称可以抽象,例如:declare -n aref; a() { echo "function a"; }; aref=a 然后$aref 将执行a。
echo ${!aref},然后${!aref}
好吧 bash 已经完成了,所以这是完全可能的 ;)
但除此之外,它并不值得考虑。
您可以通过以下方式模拟这种行为:
echo myval ; ( foocmd "$_" && barcmd "$_" )
但是为什么?!?
【讨论】:
在 PATH 中创建 fn 文件
#!/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"
你可以这样做:
foo=$(fn 'echo $1')
${foo} "bar"
【讨论】: