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

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


当前回答

我写了swag就是为了实现这一点。

你可以这样做

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"

在ascinema上查看!

其他回答

这是我过去看到的所有组合,并决定哪一个读起来很酷:

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

我用这个做彩色印刷

#!/bin/bash
#--------------------------------------------------------------------+
#Color picker, usage: printf $BLD$CUR$RED$BBLU'Hello World!'$DEF     |
#-------------------------+--------------------------------+---------+
#       Text color        |       Background color         |         |
#-----------+-------------+--------------+-----------------+         |
# Base color|Lighter shade| Base color   | Lighter shade   |         |
#-----------+-------------+--------------+-----------------+         |
BLK='\e[30m'; blk='\e[90m'; BBLK='\e[40m'; bblk='\e[100m' #| Black   |
RED='\e[31m'; red='\e[91m'; BRED='\e[41m'; bred='\e[101m' #| Red     |
GRN='\e[32m'; grn='\e[92m'; BGRN='\e[42m'; bgrn='\e[102m' #| Green   |
YLW='\e[33m'; ylw='\e[93m'; BYLW='\e[43m'; bylw='\e[103m' #| Yellow  |
BLU='\e[34m'; blu='\e[94m'; BBLU='\e[44m'; bblu='\e[104m' #| Blue    |
MGN='\e[35m'; mgn='\e[95m'; BMGN='\e[45m'; bmgn='\e[105m' #| Magenta |
CYN='\e[36m'; cyn='\e[96m'; BCYN='\e[46m'; bcyn='\e[106m' #| Cyan    |
WHT='\e[37m'; wht='\e[97m'; BWHT='\e[47m'; bwht='\e[107m' #| White   |
#-------------------------{ Effects }----------------------+---------+
DEF='\e[0m'   #Default color and effects                             |
BLD='\e[1m'   #Bold\brighter                                         |
DIM='\e[2m'   #Dim\darker                                            |
CUR='\e[3m'   #Italic font                                           |
UND='\e[4m'   #Underline                                             |
INV='\e[7m'   #Inverted                                              |
COF='\e[?25l' #Cursor Off                                            |
CON='\e[?25h' #Cursor On                                             |
#------------------------{ Functions }-------------------------------+
# Text positioning, usage: XY 10 10 'Hello World!'                   |
XY () { printf "\e[$2;${1}H$3"; }                                   #|
# Print line, usage: line - 10 | line -= 20 | line 'Hello World!' 20 |
line () { printf -v _L %$2s; printf -- "${_L// /$1}"; }             #|
# Create sequence like {0..(X-1)}                                    |
que () { printf -v _N %$1s; _N=(${_N// / 1}); printf "${!_N[*]}"; } #|
#--------------------------------------------------------------------+

所有的基本颜色都设置为vars,还有一些有用的函数:XY、line和que。将此脚本源于您的一个脚本,并使用所有颜色vars和函数。

您可以使用很棒的tput命令(在Ignacio的回答中建议)来为各种事情生成终端控制代码。


用法

稍后将讨论特定的tput子命令。

直接的

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

tput setaf 1; echo "this is red text"

使用而不是&&所以如果tput出错,文本仍然显示。

Shell变量

另一个选项是使用shell变量:

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

tput产生的字符序列被终端解释为具有特殊含义。他们不会被展示出来。请注意,它们仍然可以保存到文件中,或由终端以外的程序作为输入进行处理。

命令替换

使用命令替换将tput的输出直接插入回显字符串可能更方便:

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         R G B

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而不是setab,setf而不是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 Y X # 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命令使终端摇摆一秒钟以吸引用户的注意力。


脚本

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

通过回显多行字符串和管道来避免临时文件:

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

另请参见

见man 1 tput有关命令的完整列表以及有关这些选项的更多详细信息,请参阅man 5 terminfo。(相应的tput命令列在从第81行开始的巨大表的Cap-name列中。)

这里有一个简单的脚本,可以轻松管理bashshellpromt中的文本样式:

https://github.com/ferromauro/bash-palette

使用以下方法导入代码:

source bash-palette.sh

在echo命令中使用导入的变量(使用-e选项!):

echo -e ${PALETTE_GREEN}Color Green${PALETTE_RESET}

可以组合更多元素:

echo -e ${PALETTE_GREEN}${PALETTE_BLINK}${PALETTE_RED_U}Green Blinking Text over Red Background${PALETTE_RESET}

我刚刚将所有解决方案中的好捕获合并在一起,最终得出:

cecho(){
    RED="\033[0;31m"
    GREEN="\033[0;32m"  # <-- [0 means not bold
    YELLOW="\033[1;33m" # <-- [1 means bold
    CYAN="\033[1;36m"
    # ... Add more colors if you like

    NC="\033[0m" # No Color

    # printf "${(P)1}${2} ${NC}\n" # <-- zsh
    printf "${!1}${2} ${NC}\n" # <-- bash
}

你可以称之为:

cecho "RED" "Helloworld"