Bash - 将颜色代码存储在变量中

Bash - 将颜色代码存储在变量中

如何将彩色文本存储在变量中并稍后用颜色打印?

我在 100 次搜索中从未看到这个问题的答案,这都是关于 PS1 提示、内联 printf 或使用 ls --color 中的数据。我需要自己将颜色添加到变量中,并稍后将其打印着色。

name="Hello"
name=$name"\e[36m\(Test\)\e[0m"
echo $name
printf $name

我从中得到的输出是:

Hello \e[36m(Test)\e0m

它不会根据变量中的数据着色。
我们如何将颜色代码存储在变量中以便稍后打印
感谢
Jaeden“Sifo Dyas”al'Raec Ruiner

答案1

在 bash 中有三个选项:echo -eprintf$'...'

最后一个是最简单的:

$ name="Hello"; name=$name$'\033[34m(Test)\e[0m' ; echo "$name"
Hello(Test)

在本例中,颜色代码存储在变量中。 “查看”代码(除了查看颜色之外)的最简单方法是使用一些十六进制查看器:

$ echo "$name" | od -vAn -tcx1
   H   e   l   l   o 033   [   3   5   m   (   T   e   s   t   )
  48  65  6c  6c  6f  1b  5b  33  35  6d  28  54  65  73  74  29
 033   [   0   m  \n
  1b  5b  30  6d  0a

当您需要“查看”代码(以及它们为何有效或无效)时,请使用它。

颜色代码位于 var 内部,已被解释。通过这种方式,您可以为某种颜色创建一个 var 并使用它:

$ blue=$'\033[34m'; reset=$'\033[0m'
$ echo "Hello $blue Test $reset Colors"

另一种方法是将代码存储在变量中,并在每次需要它们的“效果”时解释它们。

$ blue='\033[34m'; reset='\033[0m'
$ echo "Hello $blue Test $reset Colors"
Hello \033[34m Test \033[0m Colors
$ echo -e "Hello $blue Test $reset Colors"
Hello  Test  Colors

“测试”为蓝色,“颜色”为黑色(如果您的控制台屏幕为白色)。

该命令echo -e不像 printf 那样可移植(且安全):

$ blue='\033[34m'; reset='\033[0m'
$ printf "%s $blue%s $reset%s" "Hello" "Test" "Colors"
Hello Test Colors

整个颜色列表(背景)将通过(打印空格)可见:

 printf '\e[%sm ' {40..47} 0; echo

或者,使用前景色:

 printf '\e[%smColor=%s  ' {30..37}{,} 0 0; echo

答案2

而不是

name="Hello"
name=$name"\e[36m\(Test\)\e[0m"
echo $name
printf $name

你可以让它更简单一些

name="Hello"
name=$name"$(tput setaf 6)(Test)$(tput sgr0)"
echo $name
printf $name

这种方法比记住扩展颜色(超过 8 个)的适当字符串更简单。例如,运行此脚本:

#!/bin/sh
[ $# = 0 ] && exec $0 6
name="Hello"
name=$name"$(tput setaf $1)(Test)$(tput sgr0)"
echo $name
printf $name

使用参数 6、12、24 并TERM设置为xterm-256color$name,与as escape对应的\E

Hello\E[36m(Test)\E(B\E[m
Hello\E[94m(Test)\E(B\E[m
Hello\E[38;5;24m(Test)\E(B\E[m

以供参考:

答案3

\e是一个特殊的转义代码,专门用于echo -e解析为转义字符^[(字面意思是 Ctrl-[;不是脱字符号 [)。要将其存储到变量中而不需要学习在编辑器中输入文字转义符,您可以使用:

#!/bin/bash
BOLD="$( echo -e "\e[1m" )"
CYAN="$( echo -e "\e[36m" )"

echo "I am feeling ${BOLD}really ${CYAN}blue!"

答案4

printf应该正确显示颜色

[user@host ~]$ name="Hello"
[user@host ~]$ name=$name"\e[36m\(Test\)\e[0m"
[user@host ~]$ echo $name
Hello\e[36m\(Test\)\e[0m
[user@host ~]$ printf $name
Hello\(Test\)[user@host ~]$

最后一行“Test”为青色,没有新行。


因为echo你需要添加-e

$ help echo
[...]
Options:
      -n        do not append a newline
      -e        enable interpretation of the following backslash escapes
      -E        explicitly suppress interpretation of backslash escapes
[...]

只要使用 就可以将颜色存储在变量中echo -e

export txtblk='\033[0;30m' # Black - Regular
export txtred='\033[0;31m' # Red
export txtgrn='\033[0;32m' # Green
export txtylw='\033[0;33m' # Yellow
export txtblu='\033[0;34m' # Blue
export txtpur='\033[0;35m' # Purple
export txtcyn='\033[0;36m' # Cyan
export txtwht='\033[0;37m' # White
export bldblk='\033[1;30m' # Black - Bold
export bldred='\033[1;31m' # Red
export bldgrn='\033[1;32m' # Green
[...]
export undblk='\033[4;30m' # Black - Underline
export undred='\033[4;31m' # Red
[...]
export bakblk='\033[40m'   # Black - Background
export bakred='\033[41m'   # Red
export badgrn='\033[42m'   # Green
export txtrst='\033[0m'    # Text Reset

[user@host ~]$ echo "$txtblu hello"
\033[0;34m hello
[user@host ~]$ echo -e "$txtblu hello"
hello # this text is blue

相关内容