【问题标题】:Bash: Correct way to Iterate over MapBash:迭代地图的正确方法
【发布时间】:2011-02-06 14:33:20
【问题描述】:

在 Bash 中,我可以使用这种通用结构创建一个 ma​​p(哈希表)

hput() {
  eval "$1""$2"='$3'
}

hget() {
  eval echo '${'"$1$2"'#hash}'
}

然后像这样使用它:

hput capitals France Paris
hput capitals Spain Madrid
echo "$(hget capitals France)"

但是我如何最好地迭代地图中的条目?例如,在 Java 中我会这样做:

for (Map.Entry<String, String> entry : capitals.entrySet()) {
  System.out.println("Country " + entry.getKey() + " capital " + entry.getValue());
}

在 Bash 中是否有一种通用的方法来完成类似的事情?

【问题讨论】:

    标签: bash map hashtable iteration


    【解决方案1】:
    hkeys() {
        set | grep -o "^${1}[[:alnum:]]*=" | sed -re "s/^${1}(.*)=/\\1/g"
    }
    for key in $(hkeys capitols) ; do
        echo $key
    done
    

    而且你的 hget 函数是错误的。试试这个:

    hput capitols Smth hash
    hget capitols Smth
    

    第二个命令应该返回字符串哈希,但它什么也没返回。从您的函数中删除 «#hash» 字符串。

    另外,echo "$(hget capitols France)" 是模棱两可的。您可以改用hget capitols France

    【讨论】:

      【解决方案2】:

      如果你有 bash 4.0,你可以使用associative arrays。否则你可以使用awks 关联数组

      【讨论】:

      • 我在 Bash 3 上,所以 awk 解决方案看起来比我自己的解决方案好得多。谢谢。
      【解决方案3】:

      这是一种方法:

      for h in ${!capitols*}; do indirect=$capitols$h; echo ${!indirect}; done
      

      这是另一个:

      for h in ${!capitols*}; do key=${h#capitols*}; hget capitols $key; done
      

      还有一个:

      hiter() { 
          for h in $(eval echo '${!'$1'*}')
          do
              key=${h#$1*}
              echo -n "$key "
              hget $1 $key
          done
      }
      hiter capitols
      France Paris
      Spain Madrid
      

      顺便说一句,“国会大厦”是一座建筑物。城市被称为“首都”。

      【讨论】:

        猜你喜欢
        • 2018-10-17
        • 2011-06-22
        • 2019-01-26
        • 1970-01-01
        • 1970-01-01
        • 2013-04-13
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多