根据
man bash
,可以使用键值对的平面列表分配关联数组:
[…] 或被解释为交替键和值序列的单词列表: name=( key1 value1 key2 value2 ...)
这确实有效,但是使用数组来获取这些“交替的键和值”是行不通的:
name=( "${someArray[@]}" )
考虑这个例子:
#!/usr/bin/env bash
set -u
#declare -A map=(one ONE two TWO)
array=(one ONE two TWO)
declare -A map=("${array[@]}")
# Workaround with `eval`:
#eval "declare -A map=(${array[@]@Q})"
echo "KEYS:"
printf ' %s\n' "${!map[@]}"
echo "VALUES:"
printf ' %s\n' "${map[@]}"
echo "${#map[@]}"
实际产量:
KEYS:
one ONE two TWO
VALUES:
预期输出:
KEYS:
two
one
VALUES:
TWO
ONE
为什么会这样?
在带引号的字符串中包含数组括号(以保留空格)。另外,如果键或值包含空格,请使用
@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[@]}"
KEYS:
one
tw o
VALUES:
O NE
TWO
2