如何在 shell 中为 printf %s 的输出着色?

How can I colour the output of printf %s in shell?

我在 printf 命令的多行上有一些 ASCII 艺术,例如:

printf %s '

\    /
 \  /
  \/
'

而且我想让每一行的颜色都不同。我已经尝试了明显的 \e[31m 但这不起作用,因为我需要 printf 命令打印为字符串 (%s) 并忽略反斜杠,因为我的 ASCII 艺术。 我也试过这个:

r="\e1;[31m"
e="\e[0m"

a='\    /'
b=' \  /'
c='  \/'

printf $r%s$e "$a"

运气不好。 这可能吗? 谢谢。

您可以使用应用颜色的命令处理 printf 的输出。例如,

printf %s '
\    /
 \  /
  \/
 /  \
/    \
' | awk 'BEGIN{c=0} {printf "3[3%dm%s3[0m\n", 1 + c, [=10=]; c = (c + 1) % 6;}'

给予

^[[31m^[[0m
^[[32m^[[0m
^[[33m\    /^[[0m
^[[34m \  /^[[0m
^[[35m  \/^[[0m
^[[36m /  \^[[0m
^[[31m/    \^[[0m

步骤:

  • printf 命令通过管道(“|”)将其输出发送到单引号中给出的 awk 脚本。
  • 在那个脚本中,我初始化了一个计数器 'c',使用花括号中的第一个块,在特殊关键字 "BEGIN" 之后(执行一次)。
  • 大括号中的第二个块为 awk 读取的每一行执行。
  • awk 使用自己的 printf 打印转义序列设置颜色、打印文本和重置颜色。
  • “$0”符号包含整行(没有换行符)。
  • 我在每一行之后使用了一个表达式来更新 'c'(“%”是模数 运算符,使 'c' 的范围从 0 到 5)。

您可以先将颜色存储在变量中,然后使用它们来格式化字符串,如下所示:

#!/bin/bash

RED="\e[0;31m"
GREEN="\e[0;32m"
RESET="\e[0m"

printf "%s $RED%s $GREEN%s $RESET%s\n" BLACK RED GREEN BLACK

这会起作用:

r='3[31m'
e='3[0m'

a='\    /'
b=' \  /'
c='  \/'

printf "$r%s$e\n" "$a" "$b" "$c"