在 bash 中创建数组,并使用变量作为数组名称

在 bash 中创建数组,并使用变量作为数组名称

我不确定这个问题是否已得到解答,我已经看过但没有找到任何看起来像我想做的事情。

我有许多能够针对 ksh 或 bash shell 运行的 shell 脚本,并且它们使用数组。我创建了一个名为“setArray”的函数,它询问正在运行的 shell 并确定使用什么内置函数来创建数组 - 对于 ksh,set -A,对于 bash,typeset -a。但是,我在 bash 部分遇到一些问题。

该函数有两个参数:数组的名称和要添加的值。然后这将变为 ${ARRAY_NAME} 和 ${VARIABLE_VALUE}。执行以下操作:

set -A $(eval echo \${ARRAY_NAME}) $(eval echo \${${ARRAY_NAME}[*]}) "${VARIABLE_VALUE}"

在 ksh 中完美运行。然而,

typeset -a $(eval echo \${ARRAY_NAME})=( $(eval echo \${${ARRAY_NAME}[*]}) "${VARIABLE_VALUE}" )

才不是。这提供了

bash: syntax error near unexpected token '('

我知道我可以将其设置为字符串列表(例如 MYARRAY=“一二三”)并使用 IFS 循环它,但我也不想失去使用数组的能力。

有什么想法吗 ?

答案1

eval "$ARRAY_NAME"'+=("$VARIABLE_VALUE")'

(也适用于zshksh93)。

你的ksh88应该是:

eval 'set -A '"$ARRAY_NAME"' "${'"$ARRAY_NAME"'[@]}" "${VARIABLE_VALUE}"'

答案2

我发现 bash 中可以执行以下操作:

eval typeset -a $(eval echo \${ARRAY_NAME})=\( $(eval echo \${${ARRAY_NAME}[*]}) "${VARIABLE_VALUE}" \)

我所做的更改是(1)前置eval和(2)转义分隔我们构造的数组的括号。

typeset -a但是,替换为后,在 ksh 下运行相同的命令set -A会失败。您是否可以:

  • 完全摆脱typeset/ set(我认为将数组分配给变量会隐式设置其类型),或者

  • 更改您的代码以使两段特定于 shell 的代码完全分开?

在这两种情况下,此处发布的代码片段似乎都很脆弱;最好只使用附加运算符+=,它似乎在 bash 和 ksh 中都可用。

相关内容