Shell - 如何声明关联数组并遍历[重复]

Posted

技术标签:

【中文标题】Shell - 如何声明关联数组并遍历[重复]【英文标题】:Shell - How to declare an associative array and iterate through [duplicate] 【发布时间】:2020-11-14 02:58:33 【问题描述】:

我正在尝试在 sh 中声明一个关联数组并使用 for 循环运行:

test_array=([a]=10 [b]=20 [c]=30)

for k in "$!test_array[@]"
  do
  printf "%s\n" "$k=$test_array[$k]"
done

而且这只返回最后一个数组元素:

0=30

知道我做错了什么吗?

【问题讨论】:

参见例如***.com/a/3113285/297323 感谢@FredrikPihl,使用 Paused 提出的解决方案,直到另行通知,我得到了相同的结果,只有最后一个数组值显示在键 0 处。 您是否将test_array 声明为关联数组? declare -A test_array 您的意思是 Posix sh?我不知道shell是哪个程序。 @kvantour,刚刚试过,还是一样。请注意,我在 sh,而不是 bash。 【参考方案1】:

我在 bash 中对此进行了测试。

比较这两个函数。在第一个中,我正在创建一个具有整数索引的数组,在第二个中创建一个关联数组。我在 bash 中得到了预期的结果。我不确定您使用的是哪种 shell 变体,所以我不知道您是否需要添加声明或引用数组键或两者兼而有之。

x () 
 
    declare -a test_array;
    test_array=([a]=10 [b]=20 [c]=30);
    for k in "$!test_array[@]";
    do
        printf "%s\n";
        echo "$k=$test_array[$k]";
    done

y

y () 
 
    declare -A test_array;
    test_array=(["a"]=10 ["b"]=20 ["c"]=30);
    for k in "$!test_array[@]";
    do
        printf "%s\n";
        echo "$k=$test_array[$k]";
    done

x

【讨论】:

这没有回答问题。问题是关于 Posix sh,它没有 declare 语句,也不支持关联数组 他没有在问题中指定posix sh。我回答后澄清了这一点。【参考方案2】:

关联数组是bash 4 的功能!在sh 中不可用。

正如 kvantour 在 cmets 中指出的,我们可以模仿 sh 中关联数组的行为。看到这个reference1,reference2。

【讨论】:

以上是关于Shell - 如何声明关联数组并遍历[重复]的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本编程数组

第六章 Shell数组应用

linux—shell编程之数组和字符串处理工具

shell编程之数组,字符串还有高级变量

如何检查多维关联数组中的重复值?

如何在PHP中按字符将数组拆分为关联数组[重复]