在bash函数中返回值的一种方法是使用命令替换:
user_id | user_name | u_p_prod=1 | u_p_prod=2 | u_p_prod=3 | u_p_prod=4 |
1 | adam | 1 | 1 | 0 | 0 |
2 | berta | 0 | 0 | 1 | 0 |
3 | caesar | 0 | 0 | 0 | 0 |
这种方法有助于透明的赋值语法:
function foo () {
echo ${1}-foo
}
function bar () {
echo ${1}-bar
}
并评估函数参数:
reply_bar=$(bar koo)
echo $(foo reply_bar) # koo-bar-foo
另一种方法是传入一个您想要分配输出的变量的名称。
echo $(foo $(bar koo)) # koo-bar-foo
但是现在你不能将另一个评估函数的输出传递给函数,比如function foo () {
eval "$1"="'${2}'-foo"
}
function bar () {
eval "$1"="'${2}'-bar"
}
bar reply_bar koo
foo reply_foo "$reply_bar"
echo $reply_foo # koo-bar-foo
。相反,你必须做一些丑陋的事情:
$(foo $(bar koo))
或将其包装在执行类似操作的foo reply_foo $(bar reply_bar koo; echo $reply_bar)
echo $reply_foo # koo-bar-foo
函数中。
所以,这是我的问题:如何编写我的函数以使它们可组合,将输出分配给变量,并且不像罪一样难看?
答案 0 :(得分:3)
当然,将捕捉移动到自己的功能中!
# Underscore-prefixing variables to avoid restricting the namespace we can assign to
capturing_output_into() {
local _destvar _output _retval # separate local declaration to avoid impacting
# exit status later (want to return exit status of
# "$@", not of "local").
_destvar=$1; shift # capture destination variable name
_output="$( "$@" )"; _retval=$? # capture output and retval; on the same line so
# future logging or extensions aren't likely to
# interrupt retval by mistake.
printf -v "$_destvar" %s "$_output" # store output in destination
return "$_retval" # and return captured retval
}
foo() { echo "${1}-foo"; }
bar() { echo "${1}-bar"; }
capturing_output_into reply_foo foo "$(bar koo)"
那就是说,foo
和bar
没有组成 - 我们正在传递(/ {引用的名称)foo
作为capturing_output_into
的论据,但那就是全部。如果您想要真正的功能组合,您可能正在实施类似partial
的内容,但 确实倾向于涉及eval
(和因此,(1)需要非常谨慎和谨慎来构建一个实际正确的实现;以及(2)使用适当的原语构建的语言是更好的选择。
你可能会考虑scsh吗? :)