Shell脚本中的“友好”终端颜色名称?


25

我知道使用Ruby和Javascript等语言编写的库,可以通过使用“红色”之类的颜色名称来简化终端脚本的着色。

但是Bash或Ksh或其他中的shell脚本是否有类似的东西?


8
请将答案标记为正确...到目前为止,您只在总共46个问题中标记了1个!
m13r 2014年

Answers:


39

您可以在bash脚本中定义颜色,如下所示:

red=$'\e[1;31m'
grn=$'\e[1;32m'
yel=$'\e[1;33m'
blu=$'\e[1;34m'
mag=$'\e[1;35m'
cyn=$'\e[1;36m'
end=$'\e[0m'

然后使用它们以您需要的颜色进行打印:

printf "%s\n" "Text in ${red}red${end}, white and ${blu}blue${end}."

11

您可以使用tput ORprintf

使用tput

只需如下创建函数并使用它们

shw_grey () {
    echo $(tput bold)$(tput setaf 0) $@ $(tput sgr 0)
}

shw_norm () {
    echo $(tput bold)$(tput setaf 9) $@ $(tput sgr 0)
}

shw_info () {
    echo $(tput bold)$(tput setaf 4) $@ $(tput sgr 0)
}

shw_warn () {
    echo $(tput bold)$(tput setaf 2) $@ $(tput sgr 0)
}
shw_err ()  {
    echo $(tput bold)$(tput setaf 1) $@ $(tput sgr 0)
}

您可以使用 shw_err "WARNING:: Error bla bla"

使用 printf

print red; echo -e "\e[31mfoo\e[m"

2
echo -e不是printf,并且还需要警告它与tput选项不同,因为它不会自动适应西装$TERM
Toby Speight


4

对于简单的常用用法(仅用单一颜色的全行文本加上结尾的换行符),我将jasonwryan的代码修改如下:

#!/bin/bash

red='\e[1;31m%s\e[0m\n'
green='\e[1;32m%s\e[0m\n'
yellow='\e[1;33m%s\e[0m\n'
blue='\e[1;34m%s\e[0m\n'
magenta='\e[1;35m%s\e[0m\n'
cyan='\e[1;36m%s\e[0m\n'

printf "$green"   "This is a test in green"
printf "$red"     "This is a test in red"
printf "$yellow"  "This is a test in yellow"
printf "$blue"    "This is a test in blue"
printf "$magenta" "This is a test in magenta"
printf "$cyan"    "This is a test in cyan"

或在Awk中,稍加修改:awk -v red="$(printf '\e[1;31m%%s\e[0m\\n')" -v green="$(printf '\e[1;32m%%s\e[0m\\n')" 'BEGIN { printf red, "This text is in red"; printf green, "This text is in green" }'
通配符

3

更好的方法是tput根据输出/终端功能使用转义字符。(如果终端无法解释\e[*颜色代码,那么它将被“污染”,从而使输出难以阅读。(或者有时,如果您grep输出这样的结果,则会\e[*在结果中看到这些内容)

请参阅本教程tput

你可以写 :

blue=$( tput setaf 4 ) ;
normal=$( tput sgr0 ) ;
echo "hello ${blue}blue world${normal}" ;

这是在终端上打印彩色时钟的教程

另外,请注意,tput在将STDOUT重定向到文件时,可能仍会打印转义符:

$ myColoredScript.sh > output.log ;
# Problem: output.log will contain things like "^[(B^[[m"

为了防止这种情况发生,请tput像在此解决方案中建议的那样设置变量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.