Como usar printf e% s quando existem códigos de cores?

5

Eu tinha estas linhas:

if [[ $# -eq 0 ]]; then
  printf "$fail_color Error - Function: $function, Line: $line_number \n"
  printf "do_test: Third parameter missing - expected result\n"
  exit 1
fi

Isso funciona bem e me dá a saída pretendida de Error - Function: words, Line: 94

Eu usei o ShellCheck e ele recomendou

printf "$fail_color Error - Function: $function, Line: $line_number \n
             ^––SC2059 Don't use variables in the printf format string. Use printf "..%s.." "$foo".

Então, tentei alterá-lo para

  printf "%s Error - Function: %s, Line: %s \n", "$fail_color", "$function", "$line_number"

mas agora a saída mostra os detalhes do código de cores em vez da cor:

3[31;1m, Error - Function: words,, Line: 94 
,do_test: Third parameter missing - expected result

Relacionado - há uma maneira melhor de nomear as strings além de vários %s 's?

Detail - as cores são definidas desta maneira:

fail_color="3[31;1m"
pass_color="3[32;1m"
color_end="3[0m"
    
por Michael Durrant 25.05.2015 / 13:53

3 respostas

4

Eu gosto da resposta de Cyrus, mas essa sintaxe também funciona:

#!/usr/bin/env bash

fail_color=$'3[31;1m'
color_end=$'3[0m'
function="foo"
line_number="42"

printf "%sError - Function: %s, Line: %d%s\n" "$fail_color" "$function" "$line_number" "$color_end"

E o ShellCheck diz "Tudo parece bom!". :)

    
por 25.05.2015 / 14:51
7
fail_color="3[31;1m"
color_end="3[0m"
function="foo"
line_number="42"

printf "%bError - Function: %s, Line: %d%b\n" "$fail_color" "$function" "$line_number" "$color_end"

Saída:

Error - Function: foo, Line: 42

Testado com o Ubuntu 11.04 (bash 4.2.8 (1) -release), Ubuntu 14.04.1 LTS (bash 4.3.11 (1) -release), RHEL 5.1 (bash 3.1.17 (1) -release), RHEL 6.0 (bash 4.1.2 (1) -release), RHEL 7.0 (bash 4.3.11 (1) -release) e Solaris 11 (bash 4.1.9 (1) -release)

    
por 25.05.2015 / 14:45
-2

A variável "$fail_color" contém uma ou mais barras invertidas antes do 033 , tente alterá-la ou remova o "" para que ela seja lixificada.

3

é suposto ser o caractere ESC (ASCII 27 decimal, 033 octal).

    
por 25.05.2015 / 13:55