如果我使用模式0
,我们可以设置字体颜色和背景颜色,例如
echo -e "\e[0;31;47m teststring \e[0m"
但我希望使用相反的颜色作为背景颜色(我认为是青色)。所以我想使用该模式7
(模式7
将获得相反的背景)。但它并不总是有效:
任何人都可以告诉我如何使用这种模式吗?
答案1
\e[7m
是反向视频的代码(也经常用于脱颖而出模式)在大多数终端中。不过,它的作用是将背景颜色替换为前景色,并将前景色替换为背景颜色,它不是像摄影负片那样的反视频。
对于照相负片,一些终端支持:
\e[38;2;RED;GREEN;BLUEm # for foreground
\e[48;2;RED;GREEN;BLUEm # for background
转义序列,其中RED
,GREEN
是BLUE
从 0 到 255 的十进制数。这告诉终端在调色板中选择最接近 RGB 规范的颜色。
所以你可以这样做:
straight_color() {
printf '\33[48;2;%s;%s;%sm\33[38;2;%s;%s;%sm' "$@"
}
negative_color() {
for c do
set -- "$@" "$((255 - c))"
shift
done
straightcolor "$@"
}
然后例如:
straight_color 255 0 0 255 255 255
对于亮红色背景上的亮白色前景以及:
negative_color 255 0 0 255 255 255
为底片(亮青色上的黑色)。
答案2
仔细阅读维基页面ANSI 转义码;你可以使用\e[46m
等
答案3
处理这个问题的最佳方法是使用terminfo
库。这比记住转义码要容易得多,而且通常不太容易出错。 (它也是与终端无关的,但我怀疑您现在不太可能使用非 ANSI 终端设备。)
# Use reversed colours
tput smso
echo hello, world
tput rmso
您甚至可以以编程方式将代码放入变量中,如下所示
smso=$(tput smso)
rmso=$(tput rmso)
echo "${smso}Hello again${rmso}"
还有颜色控制,使用tput setf {colour}
和tput setb {colour}
。 (搜索man terminfo
“颜色处理”。)这些更复杂,所以我倾向于使用一个小脚本来处理它们
colour blue yellow
echo this is blue on yellow
这是脚本
#!/bin/sh
#
# Take a pair of colours and set the foreground and background,
# respectively.
#
########################################################################
#
NULL=/dev/null
fg="$1"
bg="$2"
########################################################################
# Translate a colour name to the corresponding ANSI index value
#
colourNo ()
{
case "$1" in
black|0) echo 0 ;;
blue|1) echo 1 ;;
green|2) echo 2 ;;
cyan|3) echo 3 ;;
red|4) echo 4 ;;
magenta|5) echo 5 ;;
yellow|6) echo 6 ;;
white|7) echo 7 ;;
esac
return
}
########################################################################
# Go
#
if test "X$1" = 'X-?'
then
progname=`basename "$0"`
echo "Usage: $progname [<fg_colour>|- [bg_colour]]" >&2
exit 1
fi
if test -n "$fg" -a "X$fg" != "X-"
then
colour=`colourNo "$fg"`
test -n "$colour" && tput setf "$colour"
fi
if test -n "$bg" -a "X$bg" != "X-"
then
colour=`colourNo "$bg"`
test -n "$colour" && tput setb "$colour"
fi
exit 0