为什么 Bash 关联数组不能与数组赋值?

问题描述 投票:0回答:1

根据

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

为什么会这样?

bash associative-array
1个回答
0
投票

在带引号的字符串中包含数组括号(以保留空格)。另外,如果键或值包含空格,请使用

@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
© www.soinside.com 2019 - 2024. All rights reserved.