web-dev-qa-db-ja.com

カラーコードがあるときに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"
5
Michael Durrant

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は「それはすべてよさそうだ!」と言います。 :)

4
PM 2Ring
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)

7
Cyrus

printf(1) 男は言う:

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

だから、それはうまくいきます: example

0
Lasiar