1

还在学习 shell 脚本和 ZSH。但是想知道是否有人知道如何创建一个简单对象数组,json 类型的对象/哈希,然后以不同颜色的列格式打印每个对象的属性。

我想在我的 zsh 插件中创建一个特定的函数,以非常精确的方式打印到我的终端。

开放式问题:

1.) 如何打印不同颜色的特定字符串

2.) 如何定义具有多个键/值对的基本对象数组

以下伪代码有望阐明我正在尝试做的事情。

function display-collection() {
  collection=(
    {param1: foo1, param2: bar1, param3: baz1 }
    {param1: foo2, param2: bar2, param3: baz2 }
    {param1: foo3, param2: bar3, param3: baz3 }
    {param1: foo4, param2: bar4, param3: baz4 }
    {param1: foo5, param2: bar5, param3: baz5 }
    {param1: foo6, param2: bar6, param3: baz6 }
  )
  print -l $collection
}

使上述函数以彩色吐出内容到终端

foo1 (RED TEXT) bar1 (DEFAULT COLOR) baz1 (YELLOW COLOR)
foo2 (RED TEXT) bar2 (DEFAULT COLOR) baz2 (YELLOW COLOR)
foo3 (RED TEXT) bar3 (DEFAULT COLOR) baz3 (YELLOW COLOR)
foo4 (RED TEXT) bar4 (DEFAULT COLOR) baz4 (YELLOW COLOR)
foo5 (RED TEXT) bar5 (DEFAULT COLOR) baz5 (YELLOW COLOR)
foo6 (RED TEXT) bar6 (DEFAULT COLOR) baz6 (YELLOW COLOR)

换句话说,像这样的列文本,每列颜色协调,foo 值将是红色,bar 值将是默认值,baz 值将是黄色

foo1 bar1 baz1
foo2 bar2 baz2
foo3 bar3 baz3
foo4 bar4 baz4
foo5 bar5 baz5
foo6 bar6 baz6

如果我可以将对齐格式化为带有任意分隔符/分隔符的有序列,则可以加分。

foo1       : bar1                = baz1
string1    : some string         = another string
string2    : some longer string  = another longer string
helloworld : This is a function  = it prints helloworld
4

1 回答 1

4

问题 #1:查看这个 StackOverflow 问题。谷歌搜索“colored function output linux”会给出一堆链接,我假设你已经阅读过(因为你在问这个问题之前做了搜索,对吧..?)。彩色输出的具体问题是什么?


问题 #2:一个简单的数组还不够吗?你的例子:

param1: foo1, param2: bar1, param3: baz1
param1: foo2, param2: bar2, param3: baz2

这似乎总是param11st, 4th, 7th(即1+3N第 th 位置)。param22+3Nth 中,param33+3Nth 中。插入param1:您的数据结构似乎非常多余。
一维数组适合这个;这只是打印的问题。

“Z-Shell 用户指南”的第 2 章,第 2.4.1 节,“数组”,是关于 zsh 中的数组。

我将创建一个专门用于打印数组的函数。

function print-array-collection() {
    autoload -Uz colors && colors # See Note 3.
    local array_name=$1

    local array_length=${#${(P)${array_name}}}
    for (( i = 1; i < $array_length; i+=3 )) do
        print -P %{${fg[red]}%}${(P)${array_name}[i]}%{$reset_color             %}${(P)${array_name}[i+1]} %{${fg[yellow]}%}${(P)${array_name}[i+2]}%{$reset_color%}
    done
}

笔记:

  1. 是将数组传递给函数的方式。
  2. 这个答案应该解释循环。
  3. zsh 颜色模块提供了一种比 ANSII 转义码更简单的颜色输入方式。
  4. 使用print -P,因为它会扩展提示序列。阅读关于 in 的部分printman zshbuiltins获取更多信息。

这是一个示例:

功能截图等


额外问题:设置分隔符应该很容易(在print -P语句中插入另一个变量。

制表符分隔可能不太难。打印数组中最长的项目可以使用宏伟的外观来完成:

 print ${array[(r)${(l.${#${(O@)array//?/X}[1]}..?.)}]}

摘自“Z-Shell 用户指南”的第 5 章第 1 段。可以使用${#${variable}}语法确定变量的长度(如上面的函数中所做的那样)。我会把剩下的留给你;)

于 2013-09-20T08:29:05.753 回答