什么是Python 字典的等价物,但在 Bash 中(应该适用于 OS X 和 Linux)。
Bash 4 本机支持此功能。确保你的脚本的 hashbang 是#!/usr/bin/env bash或者#!/bin/bash你最终不会使用sh. 确保您要么直接执行脚本,要么script使用bash script. (实际上不会 使用 Bash 执行 Bash 脚本,而且会 非常 混乱!)
#!/usr/bin/env bash
#!/bin/bash
sh
script
bash script
您通过执行以下操作声明关联数组:
declare -A animals
您可以使用普通的数组赋值运算符来填充它。例如,如果您想要一张地图animal[sound(key)] = animal(value):
animal[sound(key)] = animal(value)
animals=( ["moo"]="cow" ["woof"]="dog")
或者在一行中声明和实例化:
declare -A animals=( ["moo"]="cow" ["woof"]="dog")
然后像普通数组一样使用它们。采用
animals['key']='value'设定值
animals['key']='value'
"${animals[@]}"扩大价值观
"${animals[@]}"
"${!animals[@]}"(注意!)展开键
"${!animals[@]}"
!
不要忘记引用它们:
echo "${animals[moo]}" for sound in "${!animals[@]}"; do echo "$sound - ${animals[$sound]}"; done
在 bash 4 之前,您没有关联数组。 不要eval用来模仿他们。避免eval像瘟疫一样,因为它 是 shell 脚本的瘟疫。最重要的原因是eval将您的数据视为可执行代码(还有许多其他原因)。
eval
首先也是最重要 的:考虑升级到 bash 4。这将使整个过程对您来说更容易。
如果有无法升级的原因,这declare是一个更安全的选择。它不像 bash 代码那样评估数据,eval因此不允许任意代码注入非常容易。
declare
让我们通过引入概念来准备答案:
首先,间接性。
$ 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 中,您可以首先使用关联数组,避免这种解决方法。)
declare -g
概括:
declare -A
awk