如何在Bash中迭代关联数组
使用这个高阶函数来防止“末日金字塔”问题的出现
foreach(){ arr="$(declare -p $1)" ; eval "declare -A f="${arr#*=}; for i in ${!f[@]}; do $2 "$i" "${f[$i]}"; done }
例子:
$ bar(){ echo "$1 -> $2"; } $ declare -A foo["flap"]="three four" foo["flop"]="one two" $ foreach foo bar flap -> three four flop -> one two
我不确定这个有什么用?难道“末日金字塔”只是一种纯粹的美学问题,只适用于面向对象的语言吗?
你能解释一下吗?foreach函数有点棘手。我不明白。
优雅而简洁的解决方案。函数式编程万岁!
如何在Bash中遍历关联数组
在Bash中,我们可以通过${!array[@]}
来访问关联数组的键:
bash-4.0$ echo "${!array[@]}" foo bar
然后,遍历键值对就变得很简单:
for i in "${!array[@]}" do echo "key :" $i echo "value:" ${array[$i]} done
但是,有些用户遇到了问题。他们发现echo "${!array[@]}"
在他们的Mac机器上无效。这是因为他们的Mac使用的是Bash版本3.2.57,而不是支持这个特性的Bash版本4.4.20。所以,我们需要找到解决方法。
解决方法:
在Mac上,我们可以使用其他方式来遍历关联数组。一种方法是使用for key in "${!array[@]}"
来遍历键,然后通过${array[$key]}
来获取对应的值。以下是修正后的代码:
for key in "${!array[@]}" do echo "key :" $key echo "value:" ${array[$key]} done
通过这种方式,我们可以在不同版本的Bash中都能够正确地遍历关联数组。
本文介绍了如何在Bash中遍历关联数组。我们首先了解了如何使用${!array[@]}
来访问关联数组的键,然后通过遍历键值对的方式来遍历整个关联数组。同时,我们还解决了在旧版本的Bash中无法使用${!array[@]}
的问题,并提供了一个解决方案。无论是在新版本的Bash还是旧版本的Bash中,我们都可以通过适当的方式来遍历关联数组。
在Bash中,遍历关联数组的问题的出现原因是因为需要访问关联数组的键和值。解决方法是使用特定的语法来访问键和值。代码示例如下:
# 访问键 ${!array[@]} # 访问值 ${array[@]}
可以通过以下方式遍历关联数组的键值对:
for i in "${!array[@]}" do echo "key : $i" echo "value: ${array[$i]}" done
需要注意在`for`语句中使用了引号(双引号),并且使用了`@`代替`*`。这是为了防止键中包含空格的情况。
在另一个回答中的混淆是因为问题中的键和值都包含了"foo"和"bar"。
如果想将所有的键赋值给一个数组,可以使用以下语法:
array=(${!hash[@]})
如果键中可能包含空格,则需要对参数扩展进行引用:
array=("${!hash[@]}")
感谢提供这个信息,我没有想到这一点。
如果想要使用函数参数编号而不是变量,可以使用以下语法:
for i in "${!$1[@]}"
从Bash 4.3开始,可以使用namerefs来实现。示例代码如下:
declare -A aa aa['A']=a1 aa['B']=b2 aa['C']=c3 foo () { declare -n assoc=$1 for key in "${!assoc[@]}" do echo "Key: $key; Value: ${assoc[$key]}" done } foo aa
可以参考BashFAQ/006获取更多相关信息。
关于这个问题的官方文档可以在Bash的官方文档中找到,也可以参考其他相关的文档。