以列表为值的 Bash 关联数组

Oni*_*ni1 8 arrays bash dictionary associative-array

我必须使用 Java 工具的输出,它返回一个看起来像HashMap<String, ArrayList<String>. 我必须使用 BASH 并尝试将其声明为关联数组,这与地图非常相似。bash 中关联数组的声明应该在一行中,我尝试按以下方式执行此操作。

ARRAY=(["sem1"]=("first name" "second name") ["sem2"]=("third name") ["sem3]=OTHER_LITS)
Run Code Online (Sandbox Code Playgroud)

但这会产生以下错误:

bash: syntax error near unexpected token `('
Run Code Online (Sandbox Code Playgroud)

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

roo*_*ook 7

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

因此,这是将数组存储为Bash字典(4+ 版本)中的值的解决方案。

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

"firstname middlename secondname"

作为s1我们X字典中键的值:

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

现在我们可以将s1键的值作为数组获取:

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

变量names现在包含数组

> echo $names
firstname

> echo ${names[1]}
middlename

> echo ${#names[@]}
3
Run Code Online (Sandbox Code Playgroud)

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

"first name", "second name"

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

"first__name", "second__name"

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

> echo $names
firstname

> echo ${names[1]}
middlename

> echo ${#names[@]}
3
Run Code Online (Sandbox Code Playgroud)

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

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

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

> echo ${names/__/ }
first name

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

> echo ${#names[@]}
3
Run Code Online (Sandbox Code Playgroud)


anu*_*ava 5

在 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
Run Code Online (Sandbox Code Playgroud)

  • 呵呵,这个办法很巧妙。 (2认同)