man printf.1
下部に「...シェルには独自のバージョンのprintf
...がある可能性があります」という注記があります。この質問にはタグが付けられていますがbash
、可能であれば、任意のシェルに移植可能なスクリプトを作成しようとしています。 dash
通常、移植のための良好な最低限のベースラインである-ので、ここで答えはで動作しbash
、dash
&zsh
。スクリプトがこれらの3で機能する場合、ほとんどの場合、ほぼどこにでも移植できます。
最新の実装printf
ではdash
、[1]が与えられ色付け出力しない%s
ANSIのエスケープ文字と書式指定子\e
-しかし、書式指定子%b
進と組み合わせる\033
(ASCIIと同等のESC
)仕事を得るでしょう。外れ値についてコメントしてください、しかしAFAIK、すべてのシェルは実装されていますprintf
ASCII8進数サブセットを最小限で使用するています。
「printfで色を使用する」という質問のタイトルに対して、フォーマットを設定する最も移植性の高い方法は%b
、printf
(@ Vladからの以前の回答で参照されている)のフォーマット指定子を8進数のエスケープと組み合わせること\033
です。
Portable-color.sh
P="\033["
BLUE=34
printf "-> This is %s %-6s %s text \n" $P"1;"$BLUE"m" "blue" $P"0m"
printf "-> This is %b %-6s %b text \n" $P"1;"$BLUE"m" "blue" $P"0m"
出力:
$ ./portable-color.sh
-> This is \033[1;34m blue \033[0m text
-> This is blue text
...そして「青」は2行目の青です。
%-6s
OPのフォーマット指定子は、開始制御文字シーケンスと終了制御文字シーケンスの間のフォーマット文字列の中央にあります。
[1]参照:man dash
セクション「Builtins」::「printf」::「Format」