Как использовать printf и% s при наличии цветовых кодов?

У меня были следующие строки:

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 

Это прекрасно работает и дает мне предполагаемый выход Error - Function: words, Line: 94

Затем я использовал ShellCheck и рекомендовал

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

Поэтому я попытался изменить его на

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

но теперь на выходе отображаются данные цветового кода вместо цвета:

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

Связано – есть ли лучший способ назвать строки, отличные от нескольких %s s?

Деталь – цвет определяется следующим образом:

 fail_color="\033[31;1m" pass_color="\033[32;1m" color_end="\033[0m" 

  • Сценарий оболочки для обнаружения PDF-файлов с содержимым, отличным от ASCII
  • Управление заданием по сценарию Bash
  • регулярное выражение для извлечения информации в сценарии оболочки
  • проверить дубликат входа в файл
  • Найти родителя процесса
  • как установить кавычки вокруг переменной, чтобы программы рассматривали их как кавычки
  • Чтение содержимого файла и разбиение с помощью ksh
  • Может ли Bash Variable Expansion выполняться непосредственно при вводе пользователя?
  • 3 Solutions collect form web for “Как использовать printf и% s при наличии цветовых кодов?”

    Мне нравится ответ Кира, но этот синтаксис также работает:

     #!/usr/bin/env bash fail_color=$'\033[31;1m' color_end=$'\033[0m' function="foo" line_number="42" printf "%sError - Function: %s, Line: %d%s\n" "$fail_color" "$function" "$line_number" "$color_end" 1 #!/usr/bin/env bash fail_color=$'\033[31;1m' color_end=$'\033[0m' function="foo" line_number="42" printf "%sError - Function: %s, Line: %d%s\n" "$fail_color" "$function" "$line_number" "$color_end" 

    И ShellCheck говорит: «Все выглядит хорошо!». 🙂

     fail_color="\033[31;1m" color_end="\033[0m" function="foo" line_number="42" printf "%bError - Function: %s, Line: %d%b\n" "$fail_color" "$function" "$line_number" "$color_end" 

    Вывод:

     Ошибка - Функция: foo, Линия: 42
    

    Протестировано с 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) и Solaris 11 (bash 4.1.9 (1) -release)

    Переменная "$fail_color" содержит слишком много или слишком мало обратных косых черт перед 033 , попробуйте изменить ее или удалить "" чтобы она была debackslashified.

     \033 

    должен быть символом ESC (ASCII 27 десятичный, 033 восьмеричный).

    Linux и Unix - лучшая ОС в мире.