我正在尝试编写一个函数,该函数使用传入的名称写入数组。给定以下 bash 函数:
function writeToArray {
local name="$1"
echo "$name"
declare -a "$name"
${name[0]}="does this work?"
}
像这样运行:
writeToArray $("test")
我收到两个错误:
bash: declare: `': not a valid identifier
=does this work?: command not found
我期待能够做到这一点:
writeToArray $("test")
for item in "${test[@]}"; do
echo "item"
echo "$item"
done
这应该打印:
item
does this work?
我怎样才能正确配置它来写入数组(test
在示例中命名,这样这个命名的数组test
在函数外是可读的)?
你会为此使用 nameref :
测试:
对于
bash
还没有 namerefs 的旧版本,您可以使用eval
:当
writeToArray
被作为test
参数调用时,被作为参数eval
传递,然后被 uated 作为 shell 语言中的代码,它分配给数组的索引 0 的元素(也适用于关联数组;标量变量被转换为数组) .test[0]='does this work?'
eval
does this work?
test
请注意,这
$("test")
是用于捕获和扩展命令输出的语法test
,并且在列表上下文中拆分+glob它。test
(又名[
)在未传递任何参数时不产生任何输出),因此$("test")
扩展为空字符串并且 split+glob 给你什么都没有。在这里,它是您要传递给的变量的名称
writeToArray
,因此test
,不是它的内容 ("$test"
) 也不是同名命令的输出 ("$(test)"
),更不用说受 split+glob 约束的同名命令的输出和你的$("test")
尝试一样。