如何通过回声获得相反的背景

如何通过回声获得相反的背景

如果我使用模式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,GREENBLUE从 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

相关内容