如何将彩色文本存储在变量中并稍后用颜色打印?
我在 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 -e
、printf
和$'...'
。
最后一个是最简单的:
$ 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