색상 코드가 있을 때 printf와 %s를 어떻게 사용합니까?

색상 코드가 있을 때 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?

세부정보 - 색상은 다음과 같이 정의됩니다.

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

답변1

fail="\033[31;1m"
color_end="\033[0m"
func="foo"  # (renamed this variable to avoid confusion with function keyword)
line_number="42"

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

산출:

오류 - 기능: foo, 줄: 42

Ubuntu 11.04(bash 4.2.8(1)-릴리스), Ubuntu 14.04.1 LTS(bash 4.3.11(1)-릴리스), RHEL 5.1(bash 3.1.17(1)-릴리스), RHEL 6.0(bash) 사용 4.1.2(1)-릴리스), RHEL 7.0(bash 4.3.11(1)-릴리스) 및 Solaris 11(bash 4.1.9(1)-릴리스)

답변2

나는 Cyrus의 답변을 좋아하지만 이 구문도 작동합니다.

#!/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에서는 "모든 것이 좋아 보입니다!"라고 말합니다. :)

답변3

이것printf(1)그 남자는 이렇게 말했습니다.

%b     ARGUMENT as a string with '\' escapes interpreted, except
       that octal escapes are of the form \0 or \0NNN

따라서 작동합니다. 예

답변4

변수 "$fail_color"앞에 백슬래시가 너무 많거나 너무 적습니다 . 백슬래시가 없도록 033변경하거나 제거해 보세요 .""

\033

ESC 문자여야 합니다(ASCII 27 10진수, 033 8진수).

관련 정보