2017-10-21 129 views
0

我正在玩一个用于学习目的的非感性脚本(只是写了一些变量作用域处理的示例)。我定义了几个变量是这样的:作为Zsh中的关联数组处理和拆分行

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 

我然后显示出来,就像这样:

echo "Set variables ..." 
set | grep sb_var_ 
echo "\n Environment variables ..." 
env | grep sb_var_ 

这会产生这样的输出:

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 

我开始尝试到输出处理作为一个关联数组,但我无法理解语法。

此遍历每行,然后执行针对每行(单独)的字符串扩展到每行分成一个阵列(不是我想要的):

for var in $(set | grep sb_var_); do 
    tokens=(${(s:=:)var}) 
    print ${tokens[1]} ${tokens[2]} 
done 

的标准方式来处理一个关联数组是:

for key val in ${(kv)assoc_array}; do 
    echo "$key -> $val" 
done 

要使用此类型的语法的,我需要执行该命令替换,分割,因为它被返回的每一行,并存储在被直接传递到用于循环结构的关联数组的结果。我想这可能是这个样子:

for key val in ${(kv)${(s:=:)$(set | grep sb_var_)}}; do 
    echo "$key -> $val" 
done 

这是不完全正确,但并最终产生类似输出:

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 

试图将其拆分,使其多了几分可管理,我一直无法弄清楚如何获取正确的语法,我最好的尝试是这样的(无效的语法):

declare -A values=${(s:=:)$(set | grep sb_var_)} 

有什么建议?

回答

0

你缺少的东西是告诉你定义的数组,将新行视为分隔符,而不是$IFS设置的值。您应该可以通过添加标志将它们作为数组(@),将原始结果与换行符(F)相结合,然后在主循环中拆分新行上的输出(F)来解决此问题。

实施例:

# Notice the new @f and @F flags 
for key val in ${(@fkv)${(@Fs:=:)$(set | grep sb_var_)}}; do 
    echo "$key -> $val" 
done