doa*_*oak 6 bash associative-array
据此,man bash可以使用键值对的平面列表分配关联数组:
\n\n[\xe2\x80\xa6] 或被解释为交替键和值序列的单词列表: name=( key1 value1 key2 value2 ...)
\n
这确实有效,但使用数组来获取这些“交替键和值”是行不通的:\nname=( "${someArray[@]}" )
考虑这个例子:
\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[@]}"\nRun Code Online (Sandbox Code Playgroud)\n实际输出:
\nKEYS:\n one ONE two TWO\nVALUES:\n \nRun Code Online (Sandbox Code Playgroud)\n预期输出:
\nKEYS:\n two\n one\nVALUES:\n TWO\n ONE\nRun Code Online (Sandbox Code Playgroud)\n为什么会这样?
\n在带引号的字符串中包含数组括号,以保留声明项之间的空格。另外,如果键或值本身包含空格,请使用@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 进行测试
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |