如何在Bash中迭代关联数组

23 浏览
0 Comments

如何在Bash中迭代关联数组

在Bash脚本中,基于一个关联数组,我需要循环遍历它以获取键和值。\n

#!/bin/bash
declare -A array
array[foo]=bar
array[bar]=foo

\n实际上,我不太清楚如何在使用for-in循环时获取键。

0
0 Comments

使用这个高阶函数来防止“末日金字塔”问题的出现

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函数有点棘手。我不明白。

优雅而简洁的解决方案。函数式编程万岁!

0
0 Comments

如何在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中,我们都可以通过适当的方式来遍历关联数组。

0
0 Comments

在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的官方文档中找到,也可以参考其他相关的文档。

0