Bash - Armazenar códigos de cores na variável

4

Como faço para armazenar texto colorido em uma variável e imprimi-lo com cores mais tarde?

Eu nunca vejo a resposta para esta pergunta em 100 buscas, é tudo sobre prompts PS1, ou printf's inline ou usando dados de ls --color. Eu preciso adicionar a cor à variável eu mesmo e tê-la impressa colorida mais tarde.

name="Hello"
name=$name"\e[36m\(Test\)\e[0m"
echo $name
printf $name

a saída que eu tenho disso é:

Hello \e[36m(Test)\e0m

Não é colorido a partir dos dados na variável.
como podemos armazenar o código de cores em uma variável para impressão posterior
Obrigado, obrigado Jaeden "Sifo Dyas" al'Raec Ruiner

    
por JaedenRuiner 14.12.2015 / 22:58

5 respostas

2

Em vez de

name="Hello"
name=$name"\e[36m\(Test\)\e[0m"
echo $name
printf $name

você pode simplificar um pouco a seguir com

name="Hello"
name=$name"$(tput setaf 6)(Test)$(tput sgr0)"
echo $name
printf $name

Essa abordagem tornaria mais simples do que lembrar as strings apropriadas para cores estendidas (além de 8). Por exemplo, executando este script:

#!/bin/sh
[ $# = 0 ] && exec $0 6
name="Hello"
name=$name"$(tput setaf $1)(Test)$(tput sgr0)"
echo $name
printf $name

com o parâmetro 6, 12, 24 e TERM definido como xterm-256color , o correspondente $name com \E como escape seria

Hello\E[36m(Test)\E(B\E[m
Hello\E[94m(Test)\E(B\E[m
Hello\E[38;5;24m(Test)\E(B\E[m

Para referência:

  • tput (1)
  • POSIX echo e printf (sem \e em ambos)
  • OSX echo (1) e < href="https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/printf.1.html#//apple_ref/doc/man/1/printf"> printf (1 ) (mesmo comentário)
  • Linux echo (1) e printf(1) (fornece \e )
  • Bash referência (seu builtin echo pode diferir de /bin/echo , mesmo para printf )
por 15.12.2015 / 00:05
2

No bash, há três opções: echo -e , printf e $'...' .

O último é o mais fácil:

$ name="Hello"; name=$name$'3[34m(Test)\e[0m' ; echo "$name"
Hello(Test)

Nesse caso, o código de cores foi armazenado na variável. A maneira mais fácil de "ver" os códigos (além de ver a cor) é usar algum visualizador de hexadecimal:

$ echo "$name" | od -vAn -tcx1
   H   e   l   l   o 033   [   3   5   m   (   T   e   s   t   )
  48  65  6c  6c  6f  1b  5b  33  35  6d  28  54  65  73  74  29
 033   [   0   m  \n
  1b  5b  30  6d  0a

Use quando precisar "ver" os códigos (e por que eles funcionam ou não).

Os códigos de cores estão dentro do var, já interpretados. Dessa forma, você poderia criar um var para algumas cores e usá-lo:

$ blue=$'3[34m'; reset=$'3[0m'
$ echo "Hello $blue Test $reset Colors"

A outra maneira é armazenar os códigos dentro de uma variável e interpretá-los cada vez que seu "efeito" for necessário.

$ blue='3[34m'; reset='3[0m'
$ echo "Hello $blue Test $reset Colors"
Hello 3[34m Test 3[0m Colors
$ echo -e "Hello $blue Test $reset Colors"
Hello  Test  Colors

Com "Test" em azul e "Colors" em preto (se a tela do seu console for branca).

O comando echo -e não é tão portátil (e seguro) quanto printf:

$ blue='3[34m'; reset='3[0m'
$ printf "%s $blue%s $reset%s" "Hello" "Test" "Colors"
Hello Test Colors

A lista inteira de cores (fundo) será visível com (imprimindo um espaço):

 printf '\e[%sm ' {40..47} 0; echo

Ou com as cores do primeiro plano:

 printf '\e[%smColor=%s  ' {30..37}{,} 0 0; echo
    
por 15.12.2015 / 00:11
1

\e é um código de escape especial especificamente para echo -e , que é analisado em um caractere de escape, ^[ (literalmente, Ctrl- [; não caret [). Para armazenar isso em uma variável sem aprender um tipo de escape literal no seu editor, você pode usar:

#!/bin/bash
BOLD="$( echo -e "\e[1m" )"
CYAN="$( echo -e "\e[36m" )"

echo "I am feeling ${BOLD}really ${CYAN}blue!"
    
por 14.12.2015 / 23:10
0

Você pode usar as citações ANSI C para traduzir os caracteres especiais: $'...' . Então isso é um dólar antes das aspas simples. Isso permite digitar \n e \t para nova linha e tabulação, mas também para códigos de cores.

name="Hello"
name=$name$'\e[36m\(Test\)\e[0m'
echo $name
printf $name

Esses escapes ANSI C foram introduzidos no KSH mais recente que a versão 88, e estão disponíveis em bash , zsh e busybox sh . Não está disponível em dash .

    
por 14.12.2015 / 23:14
0

printf deve exibir as cores corretamente

[user@host ~]$ name="Hello"
[user@host ~]$ name=$name"\e[36m\(Test\)\e[0m"
[user@host ~]$ echo $name
Hello\e[36m\(Test\)\e[0m
[user@host ~]$ printf $name
Hello\(Test\)[user@host ~]$

Na última linha, "Teste" é ciano e não há nova linha.

para echo , você precisa adicionar -e :

$ help echo
[...]
Options:
      -n        do not append a newline
      -e        enable interpretation of the following backslash escapes
      -E        explicitly suppress interpretation of backslash escapes
[...]

Você pode armazenar cores em variáveis contanto que use echo -e .

export txtblk='3[0;30m' # Black - Regular
export txtred='3[0;31m' # Red
export txtgrn='3[0;32m' # Green
export txtylw='3[0;33m' # Yellow
export txtblu='3[0;34m' # Blue
export txtpur='3[0;35m' # Purple
export txtcyn='3[0;36m' # Cyan
export txtwht='3[0;37m' # White
export bldblk='3[1;30m' # Black - Bold
export bldred='3[1;31m' # Red
export bldgrn='3[1;32m' # Green
[...]
export undblk='3[4;30m' # Black - Underline
export undred='3[4;31m' # Red
[...]
export bakblk='3[40m'   # Black - Background
export bakred='3[41m'   # Red
export badgrn='3[42m'   # Green
export txtrst='3[0m'    # Text Reset

[user@host ~]$ echo "$txtblu hello"
3[0;34m hello
[user@host ~]$ echo -e "$txtblu hello"
hello # this text is blue
    
por 14.12.2015 / 23:10