出于学习目的,我正在使用一个无意义的脚本(只是编写一些变量作用域处理的示例)。我定义了几个这样的变量:
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循环构造。我想这可能看起来像这样:
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_)}有什么建议吗?
发布于 2017-11-02 20:44:21
您所遗漏的是告诉您定义的数组将换行符作为分隔符,而不是$IFS设置的任何值。您应该能够通过添加标志来将它们视为数组(@),用换行符连接原始结果(F),然后在主循环中的换行符上拆分输出(F),从而解决这个问题。
示例:
# Notice the new @f and @F flags
for key val in ${(@fkv)${(@Fs:=:)$(set | grep sb_var_)}}; do
echo "$key -> $val"
donehttps://stackoverflow.com/questions/46865712
复制相似问题