declare -A hashmap
hashmap["key"]="value"
hashmap["key2"]="value2"
echo "${hashmap["key"]}"
for key in ${!hashmap[@]}; do echo $key; done
for value in ${hashmap[@]}; do echo $value; done
echo hashmap has ${#hashmap[@]} elements
#!/bin/bash
# Array pretending to be a Pythonic dictionary
ARRAY=( "cow:moo"
"dinosaur:roar"
"bird:chirp"
"bash:rock" )
for animal in "${ARRAY[@]}" ; do
KEY="${animal%%:*}"
VALUE="${animal##*:}"
printf "%s likes to %s.\n" "$KEY" "$VALUE"
done
printf "%s is an extinct animal which likes to %s\n" "${ARRAY[1]%%:*}" "${ARRAY[1]##*:}"
这就是我要找的:
对于bash 4.1.5,这对我不起作用:
有参数替换,虽然它也可能是非PC的…像间接寻址。
当然,BASH 4方法更好,但是如果你需要一个黑客…只有一个黑客可以。 您可以使用类似的技术搜索数组/散列。
猛击4
Bash 4本机支持这个特性。确保脚本的hashbang是
#!/usr/bin/env bash
或#!/bin/bash
,这样就不会使用sh
。确保直接执行脚本,或者使用bash script
执行script
。(使用Bash不实际执行Bash脚本确实会发生的情况,而且会让感到困惑!)通过执行以下操作声明关联数组:
可以使用普通数组赋值运算符将其填充为元素。例如,如果要有
animal[sound(key)] = animal(value)
的映射:或者合并它们:
然后像普通数组一样使用它们。使用
animals['key']='value'
设置值"${animals[@]}"
展开值"${!animals[@]}"
(注意!
)展开键别忘了引用它们:
猛击3
在bash 4之前,没有关联数组。不要使用
eval
来模拟它们。避免像瘟疫一样,因为它是外壳脚本的瘟疫。最重要的原因是eval
将数据视为可执行代码(还有许多其他原因)。首先:考虑升级到bash 4。这将使整个过程对你来说容易得多。
如果有原因不能升级,
declare
是一个更安全的选择。它不像eval
那样计算bash代码的数据,因此不允许非常容易地插入任意代码。让我们通过介绍以下概念来准备答案:
首先,间接。
其次,
declare
:把他们聚在一起:
让我们使用它:
注意:
declare
不能放在函数中。在bash函数中使用declare
会将它创建的变量local转到该函数的作用域,这意味着我们不能用它访问或修改全局数组。(在bash 4中,您可以使用declare-g来声明全局变量,但是在bash4中,您可以首先使用关联数组,从而避免这种解决方法。)总结:
declare -A
。declare
选项。awk
并完全避免这个问题。相关问题 更多 >
编程相关推荐