代码之家  ›  专栏  ›  技术社区  ›  levant pied

在bash中的一行中循环使用映射键

  •  -1
  • levant pied  · 技术社区  · 11 月前

    在python中,我可以在一行中做到这一点:

    >>> for key, value in dict(j=1, k=2).items():
    ...     print(key, value)
    ...
    j 1
    k 2
    >>>
    

    在bash中,我可以做到:

    $ map=([j]=1 [k]=2); for key in ${!map[@]}; do value=${map[$key]}; echo $key $value; done
    j 1
    k 2
    $
    

    bash中有没有“内联”的方法 map 声明为 for -类似地,这在python示例中是怎么可能的——而不是事先声明它?

    我寻找这个的原因是为了避免必须声明两个额外的变量 地图 value 单独——换句话说,如果可能的话,在命令行上执行一行操作时,使其更短。

    2 回复  |  直到 11 月前
        1
  •  2
  •   glenn jackman    11 月前

    没有办法做

    declare -A map=([j]=1 [k]=2)
    

    这个 "${!map[@]}" parameter expansion 需要声明的参数。

    事实上,不是真的。参数扩展将一个未设置的变量愉快地扩展到空字符串中。


    你可以放下 value 变量

    for key in "${!map[@]}"; do
      printf '%s %s\n' "$key" "${map[$key]}"
    done
    

    请注意,关联数组是无序的。我对那个循环的输出是

    k 2
    j 1
    

    如果您只是在寻找一种快速检查变量内容的方法,请使用 declare -p

    declare -A map=([j]=1 [k]=2)
    declare -p map
    

    输出

    declare -A map=([k]="2" [j]="1" )
    
        2
  •  2
  •   KamilCuk    11 月前

    bash中有没有一种方法可以将声明“内联”映射到for中——类似于python示例中的可能方式——而不是事先声明它?

    你可以一行一行地读两个单词,但没有地图。

    printf "%s %s\n" j 1 k 2 | while read -r key value; do echo "$key" "$value"; done
    

    使用shellcheck检查您的脚本。