![在 bash 中创建数组,并使用变量作为数组名称](https://linux22.com/image/4731/%E5%9C%A8%20bash%20%E4%B8%AD%E5%88%9B%E5%BB%BA%E6%95%B0%E7%BB%84%EF%BC%8C%E5%B9%B6%E4%BD%BF%E7%94%A8%E5%8F%98%E9%87%8F%E4%BD%9C%E4%B8%BA%E6%95%B0%E7%BB%84%E5%90%8D%E7%A7%B0.png)
我不确定这个问题是否已得到解答,我已经看过但没有找到任何看起来像我想做的事情。
我有许多能够针对 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")'
(也适用于zsh
或ksh93
)。
你的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 中都可用。