首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Zsh中将行作为关联数组进行处理和拆分

在Zsh中将行作为关联数组进行处理和拆分
EN

Stack Overflow用户
提问于 2017-10-22 00:57:46
回答 1查看 303关注 0票数 0

出于学习目的,我正在使用一个无意义的脚本(只是编写一些变量作用域处理的示例)。我定义了几个这样的变量:

代码语言:javascript
复制
sb_var_global=TRUE
typeset    sb_var_typeset=TRUE
typeset -g sb_var_typeset_g=TRUE
declare    sb_var_declare=TRUE
declare -g sb_var_declare_g=TRUE

export sb_var_export=TRUE
typeset -gx sb_var_typeset_gx=TRUE
declare -gx sb_var_declare_g=TRUE

然后显示它们,如下所示:

代码语言:javascript
复制
echo "Set variables ..."
set | grep sb_var_
echo "\n Environment variables ..."
env | grep sb_var_

这将生成如下输出:

代码语言:javascript
复制
Displaying *set* variables ...
sb_var_declare=TRUE
sb_var_declare_g=TRUE
sb_var_export=TRUE
sb_var_func_declare_g=TRUE
sb_var_func_global=TRUE
sb_var_func_typeset_g=TRUE
sb_var_global=TRUE
sb_var_readonly=TRUE
sb_var_typeset=TRUE
sb_var_typeset_g=TRUE
sb_var_typeset_gx=TRUE

Displaying *env* variables ...
sb_var_export=TRUE
sb_var_typeset_gx=TRUE
sb_var_declare_g=TRUE

我开始尝试将该输出作为关联数组处理,但我不能完全正确地理解语法。

这个循环遍历每一行,然后对每一行执行字符串扩展(单独),将每一行拆分为一个数组(这不是我想要的):

代码语言:javascript
复制
for var in $(set | grep sb_var_); do
  tokens=(${(s:=:)var})
  print ${tokens[1]} ${tokens[2]}
done

处理关联数组的标准方法是:

代码语言:javascript
复制
for key val in ${(kv)assoc_array}; do
    echo "$key -> $val"
done

要使用这种类型的语法,我需要执行命令替换,在返回时拆分每一行,并将结果存储在一个关联数组中,该数组直接传递给for循环构造。我想这可能看起来像这样:

代码语言:javascript
复制
for key val in ${(kv)${(s:=:)$(set | grep sb_var_)}}; do
    echo "$key -> $val"
done

但这并不完全正确,最终生成的输出如下所示:

代码语言:javascript
复制
sb_var_declare -> TRUE sb_var_declare_g
TRUE sb_var_export -> TRUE sb_var_func_declare_g
TRUE sb_var_func_global -> TRUE sb_var_func_typeset_g
TRUE sb_var_global -> TRUE sb_var_readonly
TRUE sb_var_typeset -> TRUE sb_var_typeset_g
TRUE sb_var_typeset_gx -> TRUE

尝试将其拆分以使其更易于管理,我还没能弄清楚如何使语法正确,我最好的尝试是这样(无效语法):

代码语言:javascript
复制
declare -A values=${(s:=:)$(set | grep sb_var_)}

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2017-11-02 20:44:21

您所遗漏的是告诉您定义的数组将换行符作为分隔符,而不是$IFS设置的任何值。您应该能够通过添加标志来将它们视为数组(@),用换行符连接原始结果(F),然后在主循环中的换行符上拆分输出(F),从而解决这个问题。

示例:

代码语言:javascript
复制
# Notice the new @f and @F flags
for key val in ${(@fkv)${(@Fs:=:)$(set | grep sb_var_)}}; do
  echo "$key -> $val"
done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46865712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档