仍在学习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值为红色,条形值为默认值,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
答案 0 :(得分:4)
问题#1 :请参阅this StackOverflow question。谷歌搜索“彩色功能输出linux”提供了一系列链接,我假设你已经阅读过(因为你在问这个问题之前做了搜索,对吧..?)。彩色输出的具体问题是什么?
问题#2 :简单的数组是不够的?你的例子:
param1: foo1, param2: bar1, param3: baz1
param1: foo2, param2: bar2, param3: baz2
param1
,1st
,4th
(即7th
位置似乎总是1+3N
。 param2
中的2+3N
和param3
中的3+3N
。在您的数据结构中插入param1:
似乎非常多余
一维数组适合这个;这只是印刷问题。
Chapter 2 of 'A Users Guide to the Z-Shell',第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
}
注意:
print -P
因为它会扩展提示序列。有关详细信息,请阅读print
中man zshbuiltins
部分。 以下是一个示例:
奖励问题:设置分隔符非常简单(在print -P
语句中插入另一个变量。
Tab-delimitation可能并不太难。打印阵列中最长的项目可以使用雄伟的外观来完成:
print ${array[(r)${(l.${#${(O@)array//?/X}[1]}..?.)}]}
取自Chapter 5, paragraph 1, of the 'A Users guide to the Z-Shell'。可以使用${#${variable}}
语法确定变量的长度(如上面函数中所做的那样)。我会把剩下的留给你;)