【问题标题】:Bash associative array with list as value以列表为值的 Bash 关联数组
【发布时间】:2017-02-26 13:42:13
【问题描述】:

我必须使用 Java 工具的输出,它返回一个类似于 HashMap<String, ArrayList<String> 的地图数据结构。我必须使用 BASH,我试图将其声明为关联数组,这与地图非常相似。 bash 中关联数组的声明应该在一行中,我尝试按如下方式进行。

ARRAY=(["sem1"]=("first name" "second name") ["sem2"]=("third name") ["sem3]=OTHER_LITS)

但这会产生以下错误:

bash: syntax error near unexpected token `('

我可以逐行定义这一行,但我想把它放在一行中。如何在 bash 中仅在一行中定义一个关联数组?

【问题讨论】:

  • bash 中没有地图/字典功能????
  • 不,BASH 中没有多维数组
  • 有什么建议可以解决我的问题吗?
  • 你没有解释问题。为什么需要多维数组?你想做什么?
  • 我得到了一个 Java 工具的输出,它是一个 Map 数据结构。我必须在 bash 环境中使用这个地图。

标签: arrays bash dictionary associative-array


【解决方案1】:

顺便说一句,关联数组、字典或映射 - 都属于一种抽象数据类型(我们称之为字典)。

所以,这里是将 array 作为值存储在 Bash(4+ 版本)的 dictionary 中的解决方案。

注意,Bash 中的 array 是一个空格分隔的字符串列表(因此元素内没有任何空格,即字符串),所以我们可以写一个带引号的列表:

"firstname middlename secondname"

作为X 字典中s1 键的值:

declare -A X=(
  ['s1']="firstname middlename secondname"
  ['s2']="surname nickname"
  ['s3']="other"
)

现在我们可以得到s1键的值作为数组:

declare -a names=(${X[s1]})

变量names 现在包含数组

> echo $names
firstname

> echo ${names[1]}
middlename

> echo ${#names[@]}
3

最后,显示带有空格的字符串的问题部分:

"first name", "second name"

让我们做一个技巧 - 将 空格 表示为一个特殊的符号序列(它可能只是一个符号),例如双下划线:

"first__name", "second__name"

再次声明我们的字典,但在数组元素中使用“转义”空格:

declare -A X=(
  ['s1']="first__name middle__name second__name"
  ['s2']="surname nickname"
  ['s3']="other"
)

在这种情况下,我们将s1键的值作为数组获取:

declare -a names=(${X[s1]})

我们需要对数组元素进行后期处理,以将__ 的空格替换为实际的空格 符号。为此,我们只需使用 Bash 字符串的替换命令:

> echo ${names/__/ }
first name

> echo ${names[1]/__/ }
middle name

> echo ${#names[@]}
3

【讨论】:

  • 这是一个绝妙的解决方案。
【解决方案2】:

在 BASH 中不支持多维数组的情况下,可以使用这个 word-around 关联数组。关联数组中的每个key 都是map-index,array-list-index 的字符串连接:

# use one line declaration
declare -A array=([sem1,0]="first name" [sem1,1]="second name" [sem2,0]="third name" [sem3,0]="foo bar")

# loop thrpugh the map array
for i in "${!array[@]}"; do echo "$i => ${array[$i]}"; done
sem2,0 => third name
sem1,0 => first name
sem1,1 => second name
sem3,0 => foo bar

【讨论】:

  • 嘿嘿,这很聪明。
猜你喜欢
  • 2021-04-13
  • 1970-01-01
  • 2012-01-03
  • 2020-04-04
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多