我正在寻找一种明确的方法来构建生成彩色输出的shell脚本。
不幸的是,我很难找到合适的lib或良好的技术来做到这一点。我发现了很多有用但很简单的例子,例如this。此外,我发现的最全面的指南是this one。
在我开始编写自己的库之前,我想检查是否有人写过它
如果您的解决方案不适合下面的观察,那不是问题。我也想阅读它,以便它可以帮助我决定编写我自己的解决方案
我的主要关注点/观察结果:
echo -e '\033[32mthis is ugly and \033[1;32mvery green\033[0m'
在对终端控制和输出格式进行一些研究后,我正在编写试图实现此目的的this gist。到目前为止,它做得很好
答案 0 :(得分:85)
以下是我dotfiles的修改后的代码段,可以执行您想要的操作
RCol='\e[0m' # Text Reset
# Regular Bold Underline High Intensity BoldHigh Intens Background High Intensity Backgrounds
Bla='\e[0;30m'; BBla='\e[1;30m'; UBla='\e[4;30m'; IBla='\e[0;90m'; BIBla='\e[1;90m'; On_Bla='\e[40m'; On_IBla='\e[0;100m';
Red='\e[0;31m'; BRed='\e[1;31m'; URed='\e[4;31m'; IRed='\e[0;91m'; BIRed='\e[1;91m'; On_Red='\e[41m'; On_IRed='\e[0;101m';
Gre='\e[0;32m'; BGre='\e[1;32m'; UGre='\e[4;32m'; IGre='\e[0;92m'; BIGre='\e[1;92m'; On_Gre='\e[42m'; On_IGre='\e[0;102m';
Yel='\e[0;33m'; BYel='\e[1;33m'; UYel='\e[4;33m'; IYel='\e[0;93m'; BIYel='\e[1;93m'; On_Yel='\e[43m'; On_IYel='\e[0;103m';
Blu='\e[0;34m'; BBlu='\e[1;34m'; UBlu='\e[4;34m'; IBlu='\e[0;94m'; BIBlu='\e[1;94m'; On_Blu='\e[44m'; On_IBlu='\e[0;104m';
Pur='\e[0;35m'; BPur='\e[1;35m'; UPur='\e[4;35m'; IPur='\e[0;95m'; BIPur='\e[1;95m'; On_Pur='\e[45m'; On_IPur='\e[0;105m';
Cya='\e[0;36m'; BCya='\e[1;36m'; UCya='\e[4;36m'; ICya='\e[0;96m'; BICya='\e[1;96m'; On_Cya='\e[46m'; On_ICya='\e[0;106m';
Whi='\e[0;37m'; BWhi='\e[1;37m'; UWhi='\e[4;37m'; IWhi='\e[0;97m'; BIWhi='\e[1;97m'; On_Whi='\e[47m'; On_IWhi='\e[0;107m';
然后你可以echo -e "${Blu}blue ${Red}red ${RCol}etc...."
答案 1 :(得分:13)
echo -e“\ 033 [33; 31m Color Text” - 红色
echo -e“\ 033 [33; 32m Color Text” - 绿色
echo -e“\ 033 [33; 33m Color Text” - 黄色
echo -e“\ 033 [33; 34m Color Text” - 蓝色
echo -e“\ 033 [33; 35m Color Text” - Magenta
echo -e“\ 033 [33; 30m Color Text” - Gray
echo -e“\ 033 [33; 36m Color Text” - Cyan
http://techietent.blogspot.in/2013/03/how-to-echo-colored-text-in-linux-shell.html
答案 2 :(得分:9)
我把娴静的名单作为灵感,做了一点干涸。 (并将\e
更改为十六进制\x1B
,因为自Snow Leopard以来,OS X的Terminal.app不支持前者。)以下是我提出的内容:
## Colours and font styles
## Syntax: echo -e "${FOREGROUND_COLOUR}${BACKGROUND_COLOUR}${STYLE}Hello world!${RESET_ALL}"
# Escape sequence and resets
ESC_SEQ="\x1b["
RESET_ALL="${ESC_SEQ}0m"
RESET_BOLD="${ESC_SEQ}21m"
RESET_UL="${ESC_SEQ}24m"
# Foreground colours
FG_BLACK="${ESC_SEQ}30;"
FG_RED="${ESC_SEQ}31;"
FG_GREEN="${ESC_SEQ}32;"
FG_YELLOW="${ESC_SEQ}33;"
FG_BLUE="${ESC_SEQ}34;"
FG_MAGENTA="${ESC_SEQ}35;"
FG_CYAN="${ESC_SEQ}36;"
FG_WHITE="${ESC_SEQ}37;"
FG_BR_BLACK="${ESC_SEQ}90;"
FG_BR_RED="${ESC_SEQ}91;"
FG_BR_GREEN="${ESC_SEQ}92;"
FG_BR_YELLOW="${ESC_SEQ}93;"
FG_BR_BLUE="${ESC_SEQ}94;"
FG_BR_MAGENTA="${ESC_SEQ}95;"
FG_BR_CYAN="${ESC_SEQ}96;"
FG_BR_WHITE="${ESC_SEQ}97;"
# Background colours (optional)
BG_BLACK="40;"
BG_RED="41;"
BG_GREEN="42;"
BG_YELLOW="43;"
BG_BLUE="44;"
BG_MAGENTA="45;"
BG_CYAN="46;"
BG_WHITE="47;"
# Font styles
FS_REG="0m"
FS_BOLD="1m"
FS_UL="4m"
BR_
颜色是“明亮”或“高强度”颜色。通过这种方式,您甚至可以将它们与其他字体样式混合使用。 (例如带下划线的亮白色)
如果你想给它添加书签,我就为它做了一个要点:https://gist.github.com/ian128K/39a490e5aa8d3bb77a8b
答案 3 :(得分:5)
tput
可以处理超过您链接到的页面上显示的内容。根据当前终端的termcap / terminfo数据库中显示的内容,所有tput
都会输出您在echo
语句中包含的字符。一些例子:
$ tput setaf 5 | hexdump -C
00000000 1b 5b 33 35 6d |.[35m|
$ tput setaf 17 | hexdump -C
00000000 1b 5b 33 38 3b 35 3b 31 37 6d |.[38;5;17m|
$ tput reset | hexdump -C
00000000 1b 63 1b 5b 3f 31 30 30 30 6c 1b 5b 3f 32 35 68 |.c.[?1000l.[?25h|
您可以像使用gist中定义的变量一样使用它;事实上,你可以用它来以便携方式创建你的要点:
black=$(tput setaf 0)
答案 4 :(得分:4)
无耻的插件......检查Rainbow.sh
用法
只需导入rainbow.sh并开始使用脚本中的可用功能。
source rainbow.sh
vargreen=$(echogreen "Grass is green")
varred=$(echored "Roses are red")
echo "$vargreen ..Crickets are noisy.. $varred"
答案 5 :(得分:2)
我个人在我使用Andreas Schamanek代码开发的xcol工具中使用这些作为参考。
"wergerbkr84"
我在我的脚本中使用这些变量,如此
O(n)
查看我的xcol工具以获取想法和示例
https://ownyourbits.com/2017/01/23/colorize-your-stdout-with-xcol/
答案 6 :(得分:0)
以防万一有人来这里寻找使输出着色的shell过滤器,Alexey Gladkov也有一个POSIX shell实现,它在libshell中潜藏为utils/cgrep
(这是一种防御性的设计)就像他用golang写成的cfilter一样。
答案 7 :(得分:0)
只需使用此线程上的所有精彩答案快速添加到此内容,同时添加对 --no-color
标志和 NO_COLOR
环境变量的支持。
## Enable our easy to read Colour Flags as long as --no-colors hasn't been passed or the NO_COLOR Env Variable is set.
## NOTE: the NO_COLOR env variable is from: https://no-color.org/
if [[ ! $* == *--no-color* && -z "${NO_COLOR}" ]]
then
ESeq="\x1b["
# Set up our Colour Holders.
ResetColor="$ESeq"'0m' # Text Reset
Bold="$ESeq"'1m'; Underline="$ESeq"'4m'
# Regular Bold Underline High Intensity
Black="$ESeq"'0;30m'; BoldBlack="$ESeq"'1;30m'; UnderlineBlack="$ESeq"'4;30m'; IntenseBlack="$ESeq"'0;90m';
Red="$ESeq"'0;31m'; BoldRed="$ESeq"'1;31m'; UnderlineRed="$ESeq"'4;31m'; IntenseRed="$ESeq"'0;91m';
Green="$ESeq"'0;32m'; BoldGreen="$ESeq"'1;32m'; UnderlineGreen="$ESeq"'4;32m'; IntenseGreen="$ESeq"'0;92m';
Yellow="$ESeq"'0;33m'; BoldYelllow="$ESeq"'1;33m'; UnderlineYellow="$ESeq"'4;33m'; IntenseYellow="$ESeq"'0;93m';
Blue="$ESeq"'0;34m'; BoldBlue="$ESeq"'1;34m'; UnderlineBlue="$ESeq"'4;34m'; IntenseBlue="$ESeq"'0;94m';
Purple="$ESeq"'0;35m'; BoldPurple="$ESeq"'1;35m'; UnderlinePurple="$ESeq"'4;35m'; IntensePurple="$ESeq"'0;95m';
Cyan="$ESeq"'0;36m'; BoldCyan="$ESeq"'1;36m'; UnderlineCyan="$ESeq"'4;36m'; IntenseCyan="$ESeq"'0;96m';
White="$ESeq"'0;37m'; BoldWhite="$ESeq"'1;37m'; UnderlineWhite="$ESeq"'4;37m'; IntenseWhite="$ESeq"'0;97m';
#Bold High Intensity Background High Intensity Backgrounds
BoldIntenseBlack="$ESeq"'1;90m'; OnBlack="$ESeq"'40m'; OnIntenseBlack="$ESeq"'0;100m';
BoldIntenseRed="$ESeq"'1;91m'; OnRed="$ESeq"'41m'; OnIntenseRed="$ESeq"'0;101m';
BoldIntenseGreen="$ESeq"'1;92m'; OnGreen="$ESeq"'42m'; OnIntenseGreen="$ESeq"'0;102m';
BoldIntenseYellow="$ESeq"'1;93m'; OnYellow="$ESeq"'43m'; OnIntenseYellow="$ESeq"'0;103m';
BoldIntenseBlue="$ESeq"'1;94m'; OnBlue="$ESeq"'44m'; OnIntenseBlue="$ESeq"'0;104m';
BoldIntensePurple="$ESeq"'1;95m'; OnPurple="$ESeq"'45m'; OnIntensePurple="$ESeq"'0;105m';
BoldIntenseCyan="$ESeq"'1;96m'; OnCyan="$ESeq"'46m'; OnIntenseCyan="$ESeq"'0;106m';
BoldIntenseWhite="$ESeq"'1;97m'; OnWhite="$ESeq"'47m'; OnIntenseWhite="$ESeq"'0;107m';
fi
然后您可以在回声中使用它们,如下所示:
echo -e "${BoldGreen}Grabbing our variables${ResetColor}"
echo -e "${BoldGreen}Done${ResetColor} ${Red}Moving on ...${ResetColor}"
要禁用输出,您可以 export NO_COLOR=true
禁用整个会话的颜色或将标志添加到单个脚本调用 ./myscript.sh --no-color
此添加是由 https://no-color.org/ 提示的,并且在日志和文件输出等内容中看到颜色代码出现的一些经验使它们难以阅读。使用这些标志环绕颜色定义,当您预计将涉及非控制台介质时,很容易关闭脚本的颜色输出。
为了便于阅读,我还扩展了颜色名称,希望您在编写脚本时有 bit of an IDE 帮助;所以长度不如可读性重要。我什至保留了美国人的color
?
我不是 Bash/shell 专家,所以请告诉我您发现的任何问题;但我希望这能帮助一些人!