小编典典

如何在 Bash 中定义哈希表?

all

什么是Python
字典
的等价物,但在
Bash 中(应该适用于 OS X 和 Linux)。


阅读 123

收藏
2022-03-03

共1个答案

小编典典

重击 4

Bash 4 本机支持此功能。确保你的脚本的 hashbang 是#!/usr/bin/env bash或者#!/bin/bash你最终不会使用sh. 确保您要么直接执行脚本,要么script使用bash script.
(实际上不会 使用 Bash 执行 Bash 脚本,而且会 非常 混乱!)

您通过执行以下操作声明关联数组:

declare -A animals

您可以使用普通的数组赋值运算符来填充它。例如,如果您想要一张地图animal[sound(key)] = animal(value)

animals=( ["moo"]="cow" ["woof"]="dog")

或者在一行中声明和实例化:

declare -A animals=( ["moo"]="cow" ["woof"]="dog")

然后像普通数组一样使用它们。采用

  • animals['key']='value'设定值

  • "${animals[@]}"扩大价值观

  • "${!animals[@]}"(注意!)展开键

不要忘记引用它们:

echo "${animals[moo]}"
for sound in "${!animals[@]}"; do echo "$sound - ${animals[$sound]}"; done

重击 3

在 bash 4 之前,您没有关联数组。 不要eval用来模仿他们。避免eval像瘟疫一样,因为它 shell
脚本的瘟疫。最重要的原因是eval将您的数据视为可执行代码(还有许多其他原因)。

首先也是最重要 的:考虑升级到 bash 4。这将使整个过程对您来说更容易。

如果有无法升级的原因,这declare是一个更安全的选择。它不像 bash 代码那样评估数据,eval因此不允许任意代码注入非常容易。

让我们通过引入概念来准备答案:

首先,间接性。

$ animals_moo=cow; sound=moo; i="animals_$sound"; echo "${!i}"
cow

其次,declare

$ sound=moo; animal=cow; declare "animals_$sound=$animal"; echo "$animals_moo"
cow

把它们放在一起:

# Set a value:
declare "array_$index=$value"

# Get a value:
arrayGet() { 
    local array=$1 index=$2
    local i="${array}_$index"
    printf '%s' "${!i}"
}

让我们使用它:

$ sound=moo
$ animal=cow
$ declare "animals_$sound=$animal"
$ arrayGet animals "$sound"
cow

注意:declare不能放在函数中。declarebash 函数内部的任何使用都会将它创建的变量转换为该函数的 本地
变量,这意味着我们无法使用它访问或修改全局数组。(在 bash 4 中,您可以使用declare -g声明全局变量 - 但在 bash 4
中,您可以首先使用关联数组,避免这种解决方法。)

概括:

  • 升级到 bash 4 并declare -A用于关联数组。
  • declare如果无法升级,请使用该选项。
  • 考虑awk改用并完全避免该问题。
2022-03-03