首页 > 解决方案 > zsh:从函数返回关联数组

问题描述

如何从 zsh 函数返回关联数组?

我试过了:

creatAARR() {
    declare -A AARR=([k1]=2 [k2]=4)
    return $AARR
}
creatAARR

但我得到错误:

creatAARR:return:2: too many arguments

什么是正确的方法?

编辑: 我将输出捕获到标准输出,就像@chepner 建议的那样,但是新变量的行为似乎不像关联数组:

creatAARR() {
    declare -A AARR=([k1]=2 [k2]=4)
    echo "$AARR"
}
declare -A VALL
NEW_ARR=$(creatAARR)
echo "$NEW_ARR" # 2 4
echo "k1: $NEW_ARR[k1]" # prints just k1:
return

有什么建议么?

标签: shellzsh

解决方案


return只接受一个整数并设置函数的退出状态

Shell 命令实际上不能返回值。如果您想将信息传递给函数的调用者,您可以使用以下几个选项:

  • 在 Zsh 中,有一个约定,函数可以设置$REPLY为标量值或$reply数组,以传达返回值。不幸的是,没有传递关联数组的约定。
  • 您可以print返回值,但这依赖于您正确格式化输出并让调用者正确解析您的输出。对于关联数组,有很多方法可能会出错,我不建议这样做。
  • 最好的方法是让调用者指定关联数组的名称,然后您可以用值填充该数组。

您可以按如下方式使用最后一种方法:

% creatAARR() {
  local name=$1  # Restrict $name to function scope.
  shift  # Delete $1, so $@ becomes the other args.
  # -g creates a global var (not local to function).
  typeset -gA "$name"=( "$@" )
}
% creatAARR AARR k1 2 k2 4

推荐阅读