bash函数的模式:最佳方法

时间:2017-05-01 15:26:57

标签: bash function return

在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 函数中。

所以,这是我的问题:如何编写我的函数以使它们可组合,将输出分配给变量,并且不像罪一样难看?

1 个答案:

答案 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)"

那就是说,foobar没有组成 - 我们正在传递(/ {引用的名称)foo作为capturing_output_into的论据,但那就是全部。如果您想要真正的功能组合,您可能正在实施类似partial的内容,但 确实倾向于涉及eval(和因此,(1)需要非常谨慎和谨慎来构建一个实际正确的实现;以及(2)使用适当的原语构建的语言是更好的选择。

你可能会考虑scsh吗? :)