如何在Linux中改变echo的输出颜色

我正在尝试使用echo命令在terminal中打印文本。

我想用红色打印文本。 我该怎么做?

您可以使用这些ANSI转义码 :

Black 0;30 Dark Gray 1;30 Red 0;31 Light Red 1;31 Green 0;32 Light Green 1;32 Brown/Orange 0;33 Yellow 1;33 Blue 0;34 Light Blue 1;34 Purple 0;35 Light Purple 1;35 Cyan 0;36 Light Cyan 1;36 Light Gray 0;37 White 1;37 

然后在脚本中使用它们:

 # .---------- constant part! # vvvv vvvv-- the code from above RED='\033[0;31m' NC='\033[0m' # No Color printf "I ${RED}love${NC} Stack Overflow\n" 

用红色打印love

从@ james-lim的评论,如果你使用echo命令,一定要使用-e标志来允许反斜杠转义。

 # Continued from above example echo -e "I ${RED}love${NC} Stack Overflow" 

(除非要添加额外的空行,否则在使用echo时不要添加"\n"

您可以使用awesome tput命令(在Ignacio的答案中build议)为各种事情生成terminal控制代码。


用法

具体的tput子命令将在后面讨论。

直接

调用tput作为一系列命令的一部分:

 tput setaf 1; echo "this is red text" 

使用; 而不是&&所以如果input错误的文字仍然显示。

壳variables

另一个select是使用shellvariables:

 red=`tput setaf 1` green=`tput setaf 2` reset=`tput sgr0` echo "${red}red text ${green}green text${reset}" 

tput产生被terminal解释为具有特殊含义的字符序列。 他们不会被显示自己。 请注意,它们仍然可以保存到文件中或作为terminal以外的其他程序的input进行处理。

命令replace

使用命令replace将tput的输出直接插入echostring可能会更方便:

 echo "$(tput setaf 1)Red text $(tput setab 7)and white background$(tput sgr 0)" 

上面的命令在Ubuntu上产生这个命令:

彩色终端文本截图


前景和背景颜色命令

 tput setab [1-7] # Set the background colour using ANSI escape tput setaf [1-7] # Set the foreground colour using ANSI escape 

颜色如下:

 Num Colour #define RGB 0 black COLOR_BLACK 0,0,0 1 red COLOR_RED 1,0,0 2 green COLOR_GREEN 0,1,0 3 yellow COLOR_YELLOW 1,1,0 4 blue COLOR_BLUE 0,0,1 5 magenta COLOR_MAGENTA 1,0,1 6 cyan COLOR_CYAN 0,1,1 7 white COLOR_WHITE 1,1,1 

还有非ANSI版本的颜色设置函数( setb代替setabsetf代替setaf ),它们使用不同的数字,这里没有给出。

文本模式命令

 tput bold # Select bold mode tput dim # Select dim (half-bright) mode tput smul # Enable underline mode tput rmul # Disable underline mode tput rev # Turn on reverse video mode tput smso # Enter standout (bold) mode tput rmso # Exit standout mode 

光标移动命令

 tput cup YX # Move cursor to screen postion X,Y (top left is 0,0) tput cuf N # Move N characters forward (right) tput cub N # Move N characters back (left) tput cuu N # Move N lines up tput ll # Move to last line, first column (if no cup) tput sc # Save the cursor position tput rc # Restore the cursor position tput lines # Output the number of lines of the terminal tput cols # Output the number of columns of the terminal 

清除并插入命令

 tput ech N # Erase N characters tput clear # Clear screen and move the cursor to 0,0 tput el 1 # Clear to beginning of line tput el # Clear to end of line tput ed # Clear to end of screen tput ich N # Insert N characters (moves rest of line forward!) tput il N # Insert N lines 

其他命令

 tput sgr0 # Reset text format to the terminal's default tput bel # Play a bell 

随着compiz摇摇欲坠的窗口 , bel命令使terminal摆动一秒钟,吸引用户的注意力。


脚本

tput接受每行包含一个命令的脚本,这些脚本在tput退出之前按顺序执行。

通过回显多行string并pipe道来避免临时文件:

 echo -e "setf 7\nsetb 1" | tput -S # set fg white and bg red 

也可以看看

  • 看到man 1 tput
  • 有关命令的完整列表以及有关这些选项的更多详细信息,请参阅man 5 terminfo 。 (相应的tput命令列在巨大表的Cap-name列中,该行从第81行开始。)
 # Reset Color_Off='\033[0m' # Text Reset # Regular Colors Black='\033[0;30m' # Black Red='\033[0;31m' # Red Green='\033[0;32m' # Green Yellow='\033[0;33m' # Yellow Blue='\033[0;34m' # Blue Purple='\033[0;35m' # Purple Cyan='\033[0;36m' # Cyan White='\033[0;37m' # White # Bold BBlack='\033[1;30m' # Black BRed='\033[1;31m' # Red BGreen='\033[1;32m' # Green BYellow='\033[1;33m' # Yellow BBlue='\033[1;34m' # Blue BPurple='\033[1;35m' # Purple BCyan='\033[1;36m' # Cyan BWhite='\033[1;37m' # White # Underline UBlack='\033[4;30m' # Black URed='\033[4;31m' # Red UGreen='\033[4;32m' # Green UYellow='\033[4;33m' # Yellow UBlue='\033[4;34m' # Blue UPurple='\033[4;35m' # Purple UCyan='\033[4;36m' # Cyan UWhite='\033[4;37m' # White # Background On_Black='\033[40m' # Black On_Red='\033[41m' # Red On_Green='\033[42m' # Green On_Yellow='\033[43m' # Yellow On_Blue='\033[44m' # Blue On_Purple='\033[45m' # Purple On_Cyan='\033[46m' # Cyan On_White='\033[47m' # White # High Intensity IBlack='\033[0;90m' # Black IRed='\033[0;91m' # Red IGreen='\033[0;92m' # Green IYellow='\033[0;93m' # Yellow IBlue='\033[0;94m' # Blue IPurple='\033[0;95m' # Purple ICyan='\033[0;96m' # Cyan IWhite='\033[0;97m' # White # Bold High Intensity BIBlack='\033[1;90m' # Black BIRed='\033[1;91m' # Red BIGreen='\033[1;92m' # Green BIYellow='\033[1;93m' # Yellow BIBlue='\033[1;94m' # Blue BIPurple='\033[1;95m' # Purple BICyan='\033[1;96m' # Cyan BIWhite='\033[1;97m' # White # High Intensity backgrounds On_IBlack='\033[0;100m' # Black On_IRed='\033[0;101m' # Red On_IGreen='\033[0;102m' # Green On_IYellow='\033[0;103m' # Yellow On_IBlue='\033[0;104m' # Blue On_IPurple='\033[0;105m' # Purple On_ICyan='\033[0;106m' # Cyan On_IWhite='\033[0;107m' # White 

另外,您可以使用三种方法:启动和重置

 \e[0;32m or \x1b[0;32m or \033[0;32m #start \e[m or \x1b[m or \033[m #reset 

注意重置心情[m或[0m或[0

看到这张照片

贝壳:

 \e 

ASCIIhex:

 \x1B \x1b # but can not write \X1b 

ASCII oct:

 \033 

example_1与\ e:

 printf "\e[31;4m Hello \e[0m\n" 

example_2与\ x1b:

 printf "\x1b[31;4m Hello \x1b[0m\n" 

带有\ 033的example_3:

 printf "\033[31;4m Hello \033[0m\n" 

按结构显示颜色:

 for code in {0..255}; do echo -e "\e[38;05;${code}m $code: Test"; done 

 i=30; while true;do echo -e "$i = \e[0;$[i++]mStackOverFlow\e[m";if [ $i == 49 ];then break;fi; sleep 1;done 

 #!/bin/bash for (( i = 30; i <= 37; i++ )); do echo -e "\e[0;"$i"m Hi stackoverflow"; done 

在这里输入图像描述

和更多样本:

samples_1个 samples_2

和更多信息:

间信息

如果你想自定义bash提示符( .bashrc ),要小心,例如,如果你使用\e[0;31m anything \e[0东西都是好的,但是每当你使用长命令,命令在你的terminal丢失,或者kosole。 所以对于这一点,你可以使用\[\033[5;36m\] your_text \033[00m\]

例如我的.bashrc:

在这里输入图像描述

 export PS1='\[\033[5;36m\] \W \[\033[0;31m\] 〉\033[00m\]' 

最重要的是00m在行末

如果你想在你的bash上使用闪烁代码,你可以使用5个数字来做到这一点

 echo -e "Normal \e[5mBlink" 

我的konsole,它不能在gnome-terminal上工作 在这里输入图像描述

我很抱歉,如果你发现任何错误,我的英文写作不是很好


更新

在这里输入图像描述 在这里输入图像描述 在这里输入图像描述 在这里输入图像描述

你可能会感兴趣的看到我的 插图_Perl_one-liner


UPDATE2

以一种方便的方式,您可以使用这个简单的C代码来查看每个颜色代码的输出:

 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "ansi_color_code.h" int main( const int argc, const char** const argv ){ time_t rt; srand( ( unsigned ) time( &rt ) ); if( argc < 2 ){ printf( "Usage: [color-name] [some-text] [endl|]\n" ); return 0; } const char* reset_color = "\033[m"; const char** argv_iter = argv; const char* user_color = argv[ 1 ]; int index_match = -1; for( int index = 0; index < 7 * 8; ++index ){ if( !strcmp( user_color, color_name[ index ] ) ){ index_match = index; } ++argv_iter; } argv_iter = argv; argv_iter += 2; if( index_match != -1 ){ if( !strcmp( argv[ argc - 1 ], "endl" ) ){ for( int index = 2; index < argc - 1; ++index ){ printf( "%s%s%s\n",ANCI_color[ ( !strcmp( user_color, "random" ) ? rand() % 56 : index_match ) ], *argv_iter, reset_color ); ++argv_iter; } } else { for( int index = 1; index < argc - 1; ++index ){ printf( "%s%s %s",ANCI_color[ ( !strcmp( user_color, "random" ) ? rand() % 56 : index_match ) ], *argv_iter, reset_color ); ++argv_iter; } printf( "\n" ); } } else { printf( "Usage: [color-name] [some-text] [endl|]\n" ); } return 0;} 

这里是完整的代码和更多的细节在我的github上

cecho_screenshot

使用具有setaf能力的tput和1的参数。

 echo "$(tput setaf 1)Hello, world$(tput sgr0)" 
 echo -e "\033[31m Hello World" 

[31m控制文字颜色:

  • 3037前景色
  • 4047背景颜色

颜色代码的更完整列表可以在这里find 。

将文本颜色重新设置回string末尾的\033[0m是一种很好的做法。

这是颜色开关 \033[ 。 见历史 。

颜色代码1;32 (浅绿色), 0;34 (蓝色), 1;34 (浅蓝色)等

我们使用颜色开关\033[0m ,无色代码来终止颜色序列。 就像使用标记语言打开和closures标签一样。

  SWITCH="\033[" NORMAL="${SWITCH}0m" YELLOW="${SWITCH}1;33m" echo "${YELLOW}hello, yellow${NORMAL}" 

简单的彩色echofunction

 cecho() { local code="\033[" case "$1" in black | bk) color="${code}0;30m";; red | r) color="${code}1;31m";; green | g) color="${code}1;32m";; yellow | y) color="${code}1;33m";; blue | b) color="${code}1;34m";; purple | p) color="${code}1;35m";; cyan | c) color="${code}1;36m";; gray | gr) color="${code}0;37m";; *) local text="$1" esac [ -z "$text" ] && local text="$color$2${code}0m" echo "$text" } cecho "Normal" cecho y "Yellow!" 

一个简单的方法来改变颜色只有一个echo是定义这样的function:

 function coloredEcho(){ local exp=$1; local color=$2; if ! [[ $color =~ '^[0-9]$' ]] ; then case $(echo $color | tr '[:upper:]' '[:lower:]') in black) color=0 ;; red) color=1 ;; green) color=2 ;; yellow) color=3 ;; blue) color=4 ;; magenta) color=5 ;; cyan) color=6 ;; white|*) color=7 ;; # white or invalid color esac fi tput setaf $color; echo $exp; tput sgr0; } 

用法:

 coloredEcho "This text is green" green 

或者你可以直接使用德鲁的答案中提到的颜色代码:

 coloredEcho "This text is green" 2 

使用input来计算颜色代码。 避免使用ANSI转义码(例如\E[31;1m红色),因为它的便携性较差。 例如,OS X上的Bash不支持它。

 BLACK=`tput setaf 0` RED=`tput setaf 1` GREEN=`tput setaf 2` YELLOW=`tput setaf 3` BLUE=`tput setaf 4` MAGENTA=`tput setaf 5` CYAN=`tput setaf 6` WHITE=`tput setaf 7` BOLD=`tput bold` RESET=`tput sgr0` echo -e "hello ${RED}some red text${RESET} world" 

这些代码在我的Ubuntu盒子上工作:

在这里输入图像描述

 echo -e "\x1B[31m foobar \x1B[0m" echo -e "\x1B[32m foobar \x1B[0m" echo -e "\x1B[96m foobar \x1B[0m" echo -e "\x1B[01;96m foobar \x1B[0m" echo -e "\x1B[01;95m foobar \x1B[0m" echo -e "\x1B[01;94m foobar \x1B[0m" echo -e "\x1B[01;93m foobar \x1B[0m" echo -e "\x1B[01;91m foobar \x1B[0m" echo -e "\x1B[01;90m foobar \x1B[0m" echo -e "\x1B[01;89m foobar \x1B[0m" echo -e "\x1B[01;36m foobar \x1B[0m" 

这将打印所有不同颜色的字母abcd:

 echo -e "\x1B[0;93m a \x1B[0m b \x1B[0;92m c \x1B[0;93m d \x1B[0;94m" 

For循环:

 for (( i = 0; i < 17; i++ )); do echo "$(tput setaf $i)This is ($i) $(tput sgr0)"; done 

在这里输入图像描述

为了可读性

如果要提高代码的可读性 ,可以先使用echostring,然后使用sed稍后添加颜色:

 echo 'Hello World!' | sed $'s/World/\e[1m&\e[0m/' 

到目前为止,我最喜欢的答案是colorEcho。

只要发布另一个选项,你可以看看这个小工具xcol

https://ownyourbits.com/2017/01/23/colorize-your-stdout-with-xcol/

你就像grep一样使用它,例如,它会为每个参数使用不同的颜色为stdin着色

 sudo netstat -putan | xcol httpd sshd dnsmasq pulseaudio conky tor Telegram firefox "[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+" ":[[:digit:]]+" "tcp." "udp." LISTEN ESTABLISHED TIME_WAIT 

xcol示例

请注意,它接受sed将接受的任何正则expression式。

该工具使用以下定义

 #normal=$(tput sgr0) # normal text normal=$'\e[0m' # (works better sometimes) bold=$(tput bold) # make colors bold/bright red="$bold$(tput setaf 1)" # bright red text green=$(tput setaf 2) # dim green text fawn=$(tput setaf 3); beige="$fawn" # dark yellow text yellow="$bold$fawn" # bright yellow text darkblue=$(tput setaf 4) # dim blue text blue="$bold$darkblue" # bright blue text purple=$(tput setaf 5); magenta="$purple" # magenta text pink="$bold$purple" # bright magenta text darkcyan=$(tput setaf 6) # dim cyan text cyan="$bold$darkcyan" # bright cyan text gray=$(tput setaf 7) # dim white text darkgray="$bold"$(tput setaf 0) # bold black = dark gray text white="$bold$gray" # bright white text 

我在这样的脚本中使用这些variables

 echo "${red}hello ${yellow}this is ${green}coloured${normal}" 

感谢@ k-five这个答案

 declare -A colors #curl www.bunlongheng.com/code/colors.png # Reset colors[Color_Off]='\033[0m' # Text Reset # Regular Colors colors[Black]='\033[0;30m' # Black colors[Red]='\033[0;31m' # Red colors[Green]='\033[0;32m' # Green colors[Yellow]='\033[0;33m' # Yellow colors[Blue]='\033[0;34m' # Blue colors[Purple]='\033[0;35m' # Purple colors[Cyan]='\033[0;36m' # Cyan colors[White]='\033[0;37m' # White # Bold colors[BBlack]='\033[1;30m' # Black colors[BRed]='\033[1;31m' # Red colors[BGreen]='\033[1;32m' # Green colors[BYellow]='\033[1;33m' # Yellow colors[BBlue]='\033[1;34m' # Blue colors[BPurple]='\033[1;35m' # Purple colors[BCyan]='\033[1;36m' # Cyan colors[BWhite]='\033[1;37m' # White # Underline colors[UBlack]='\033[4;30m' # Black colors[URed]='\033[4;31m' # Red colors[UGreen]='\033[4;32m' # Green colors[UYellow]='\033[4;33m' # Yellow colors[UBlue]='\033[4;34m' # Blue colors[UPurple]='\033[4;35m' # Purple colors[UCyan]='\033[4;36m' # Cyan colors[UWhite]='\033[4;37m' # White # Background colors[On_Black]='\033[40m' # Black colors[On_Red]='\033[41m' # Red colors[On_Green]='\033[42m' # Green colors[On_Yellow]='\033[43m' # Yellow colors[On_Blue]='\033[44m' # Blue colors[On_Purple]='\033[45m' # Purple colors[On_Cyan]='\033[46m' # Cyan colors[On_White]='\033[47m' # White # High Intensity colors[IBlack]='\033[0;90m' # Black colors[IRed]='\033[0;91m' # Red colors[IGreen]='\033[0;92m' # Green colors[IYellow]='\033[0;93m' # Yellow colors[IBlue]='\033[0;94m' # Blue colors[IPurple]='\033[0;95m' # Purple colors[ICyan]='\033[0;96m' # Cyan colors[IWhite]='\033[0;97m' # White # Bold High Intensity colors[BIBlack]='\033[1;90m' # Black colors[BIRed]='\033[1;91m' # Red colors[BIGreen]='\033[1;92m' # Green colors[BIYellow]='\033[1;93m' # Yellow colors[BIBlue]='\033[1;94m' # Blue colors[BIPurple]='\033[1;95m' # Purple colors[BICyan]='\033[1;96m' # Cyan colors[BIWhite]='\033[1;97m' # White # High Intensity backgrounds colors[On_IBlack]='\033[0;100m' # Black colors[On_IRed]='\033[0;101m' # Red colors[On_IGreen]='\033[0;102m' # Green colors[On_IYellow]='\033[0;103m' # Yellow colors[On_IBlue]='\033[0;104m' # Blue colors[On_IPurple]='\033[0;105m' # Purple colors[On_ICyan]='\033[0;106m' # Cyan colors[On_IWhite]='\033[0;107m' # White color=${colors[$input_color]} white=${colors[White]} # echo $white for i in "${!colors[@]}" do echo -e "$i = ${colors[$i]}I love you$white" done 

结果

在这里输入图像描述

希望这个图像帮助你挑选你的bash的颜色:D

为了扩大这个答案 ,对于我们这个懒惰的人来说:

 function echocolor() { # $1 = string COLOR='\033[1;33m' NC='\033[0m' printf "${COLOR}$1${NC}\n" } echo "This won't be colored" echocolor "This will be colorful" 

这个问题一遍又一遍地回答:-)但是为什么不呢。

在现代环境中,首先使用tput比通过echo -E手动注入ASCII代码更方便

这是一个快速的bash函数:

  say() { echo "$@" | sed \ -e "s/\(\(@\(red\|green\|yellow\|blue\|magenta\|cyan\|white\|reset\|b\|u\)\)\+\)[[]\{2\}\(.*\)[]]\{2\}/\1\4@reset/g" \ -e "s/@red/$(tput setaf 1)/g" \ -e "s/@green/$(tput setaf 2)/g" \ -e "s/@yellow/$(tput setaf 3)/g" \ -e "s/@blue/$(tput setaf 4)/g" \ -e "s/@magenta/$(tput setaf 5)/g" \ -e "s/@cyan/$(tput setaf 6)/g" \ -e "s/@white/$(tput setaf 7)/g" \ -e "s/@reset/$(tput sgr0)/g" \ -e "s/@b/$(tput bold)/g" \ -e "s/@u/$(tput sgr 0 1)/g" } 

现在你可以使用:

  say @b@green[[Success]] 

要得到:

大胆绿色的成功

tput可移植性注意事项

第一次inputtput(1)源代码在1986年9月上传

tput(1)在20世纪90年代的X / Open curses语义中已经可用(1997年标准具有下面提到的语义)。

所以它( 非常 )无处不在。

而这个我曾经看到所有的组合,并决定哪些读取酷:

 for (( i = 0; i < 8; i++ )); do for (( j = 0; j < 8; j++ )); do printf "$(tput setab $i)$(tput setaf $j)(b=$i, f=$j)$(tput sgr0)\n" done done 

我写了赃物来实现这一点。

你可以做

 pip install swag 

现在,您可以通过以下方式将所有的转义命令作为txt文件安装到给定的目标:

 swag install -d <colorsdir> 

甚至更容易通过:

 swag install 

哪个会将颜色安装到~/.colors

你可以像这样使用它们:

 echo $(cat ~/.colors/blue.txt) This will be blue 

或者这样,我觉得其实更有趣:

 swag print -c red -t underline "I will turn red and be underlined" 

检查一下asciinema !

就像在外面的东西一样,通过grep传递它会突出显示为红色(但只是红色)。 您也可以使用命名pipe道,以便您的string更接近行尾:

  grep '.*' --color=always <(echo "foobar") 

这是一个简单的小脚本,我最近放在一起,将着色任何pipe道input,而不是使用“厕所”。

File: color.bsh

 #!/usr/bin/env bash ## AMDanischewski 2015+(c) Free - for (all (uses and ## modifications)) - except you must keep this notice intact. declare INPUT_TXT="" declare ADD_LF="\n" declare -i DONE=0 declare -r COLOR_NUMBER="${1:-247}" declare -r ASCII_FG="\\033[38;05;" declare -r COLOR_OUT="${ASCII_FG}${COLOR_NUMBER}m" function show_colors() { ## perhaps will add bg 48 to first loop eventually for fgbg in 38; do for color in {0..256} ; do echo -en "\\033[${fgbg};5;${color}m ${color}\t\\033[0m"; (($((${color}+1))%10==0)) && echo; done; echo; done } if [[ ! $# -eq 1 || ${1} =~ ^-. ]]; then show_colors echo " Usage: ${0##*/} <color fg>" echo " Eg echo \"Hello world!\" | figlet | ${0##*/} 54" else while IFS= read -r PIPED_INPUT || { DONE=1; ADD_LF=""; }; do PIPED_INPUT=$(sed 's#\\#\\\\#g' <<< "${PIPED_INPUT}") INPUT_TXT="${INPUT_TXT}${PIPED_INPUT}${ADD_LF}" ((${DONE})) && break; done echo -en "${COLOR_OUT}${INPUT_TXT}\\033[00m" fi 

然后用红色(196)称呼它:
$> echo "text you want colored red" | color.bsh 196

 red='\e[0;31m' NC='\e[0m' # No Color echo -e "${red}Hello Stackoverflow${NC}" 

这个答案是正确的,除了颜色的调用不应该在引号内。

 echo -e ${red}"Hello Stackoverflow"${NC} 

应该做的伎俩。