Как использовать 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" 

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 восьмеричный).

  • сценарий оболочки, чтобы присоединиться к 2 файлам на основе 2 столбцов, и если совпадение найдено, напишите несколько полей
  • Почему мой скрипт не выполняется на if.up
  • ./executable: невозможно выполнить двоичный файл
  • Перенаправление вывода петли bash в файлы, зависящие от переменных
  • Объединить файлы с двумя столбцами в один файл
  • Как проверить несколько условий в выражении IF
  • rsync - копировать содержимое каталога только в том случае, если определенный файл не существует
  • Извлечь два значения из вывода команды
  • Проблема с bash-скриптом при запуске с панели запуска
  • Как я могу сортировать список с уровнем major.minor.patch и иногда rc правильно?
  • Инструменты и стратегии для анализа устаревшего приложения на основе сценариев оболочки
  • Исключение пробелов в сценарии bash не работает
  • Linux и Unix - лучшая ОС в мире.