通过nameref给 zsh数组赋值

编程语言 2026-07-08

使用zsh 5.9:

我想创建一个函数,接收一个名称作为参数,然后创建一个以该名称命名的数组。 使用示例:

creator myarr

应该创建并填充名为myarr的数组。

如何定义这样的函数(在不使用eval来创建数组的情况下)?我知道可以通过nameref如下读取数组:

myfun() {
  name=$1
  print ${(P)name}
}

但我不能像下面这样做:

creator() {
  $name=(a b c)
}

顺便说一句,我也尝试了下面这种方法(在SO上看到的,但并没有完全理解它的作用):

 : ${(P)name::=(a b c)}

但当我用

creator myarr

这会把长度为7 的字符串 (a b c) 赋给标量变量 myarr

在zsh中有可能实现我的目标吗?

解决方案

set -A $name one two ...

read -A $name <<<"one two ..."
# or any input redirection with suitable contents

这看起来更丑陋,但可以泛化成例如:

IFS=$'\n' read -d '' -A $name < <(echo one really; grep -m1 this that; sed -n $((foo*3))p <other)

(尽管在这里,NL作为分隔符而不是结束符,末尾以换行符结束的“普通”文本会让最后一个数组元素为空;你可能想把它删除。)

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章