为什么不能为关联 Bash 数组分配数组?

doa*_*oak 6 bash associative-array

据此,man bash可以使用键值对的平面列表分配关联数组:

\n
\n

[\xe2\x80\xa6] 或被解释为交替键和值序列的单词列表: name=( key1 value1 key2 value2 ...)

\n
\n

这确实有效,但使用数组来获取这些“交替键和值”是行不通的:\nname=( "${someArray[@]}" )

\n

考虑这个例子:

\n
#!/usr/bin/env bash\n\nset -u\n\n#declare -A map=(one ONE two TWO)\narray=(one ONE two TWO)\ndeclare -A map=("${array[@]}")\n# Workaround with `eval`:\n#eval "declare -A map=(${array[@]@Q})"\n\necho "KEYS:"\nprintf \'    %s\\n\' "${!map[@]}"\necho "VALUES:"\nprintf \'    %s\\n\' "${map[@]}"\n\necho "${#map[@]}"\n
Run Code Online (Sandbox Code Playgroud)\n

实际输出:

\n
KEYS:\n    one ONE two TWO\nVALUES:\n    \n
Run Code Online (Sandbox Code Playgroud)\n

预期输出:

\n
KEYS:\n    two\n    one\nVALUES:\n    TWO\n    ONE\n
Run Code Online (Sandbox Code Playgroud)\n

为什么会这样?

\n

pmf*_*pmf 6

在带引号的字符串中包含数组括号,以保留声明项之间的空格。另外,如果键或值本身包含空格,请使用@Q引号来引用每个项目:

array=(one 'O NE' 'tw o' TWO)
declare -A map="(${array[@]@Q})"

echo "KEYS:"
printf '    %s\n' "${!map[@]}"
echo "VALUES:"
printf '    %s\n' "${map[@]}"

echo "${#map[@]}"
Run Code Online (Sandbox Code Playgroud)
KEYS:
    one
    tw o
VALUES:
    O NE
    TWO
2
Run Code Online (Sandbox Code Playgroud)

使用 GNU bash 5.2.21 进行测试