shell - 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
有什么建议么?
解决方案
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
推荐阅读
- oracle - 从三个表格中收集计划和活动的数据
- python - 交叉表填充另一列的数据
- sql - INSERT 语句与 FOREIGN KEY 约束冲突,但我可以看到主表中的数据
- facebook - 当我使用 og:video 标签时,视频没有在 Facebook 上播放
- spring-boot - Kotlin 测试对 /actuator api 的身份验证
- javascript - 禁止任何字母并确保第一个字符不是 0 正则表达式
- npm - 我可以在运行 npm 脚本跨环境之前检查环境变量吗?
- c# - c# tryParseExact 不被识别为有效的日期时间
- python - django 部署到 Heroku:服务器错误(500)
- docker - 从 jupyter docker stack 在 docker 中安装 %%R cell magic