Linux‎ > ‎

シェル - echoで文字に色をつける その1


目次


echoコマンドでは、色属性のエスケープシーケンスを記述することにより、文字に色をつけることができます。

基本的な書き方

色属性のエスケープシーケンス構文
ESC[色属性m

これを記述した個所で文字の色属性が変更され、その個所以降の文字の色属性が変更されます。ESCはエスケープ文字です。ESCには実際には「\e」か「\033」もしくは制御文字のESCそのもの(16進数で1b)を記述します。「\033」と書くのは「\n」を「\012」と書くようなもので、分かりにくいと思います。「\e」の使用をお勧めします。

色属性は、例えば「31」で「文字色=赤」を意味します。一応、以下の記述だけで「hoge」の文字色が赤になります。
echo -e "\e[31mhoge"

ただし、後続の文字も赤になってしまうため、色属性リセットのエスケープシーケンスも記述しておいたほうがいいでしょう。「ESC[0m」もしくは「ESC[m」で色属性をリセットしデフォルトにします。
echo -e "\e[31mhoge\e[m"

ちなみにechoの「-e」オプションは「\」を使ったエスケープを有効にするオプションです。もしも制御文字のESC(16進数で1b)を挿入できる場合には、「\e」も「\033」も使う必要はなくなるため「-e」オプションを使用する必要はなくなります。

カラーコード

カラーコードの「31」の1文字目「3」は文字色の指定を意味しています。「4」にすると背景色の指定の意味になります。2文字目がカラーコードになります。

カラーコードは以下になります。
 Code   Color   nomal  bold / blink
  0 Black
  1 Red
  2 Green
  3 Yellow
  4 Blue
  5 Magenta
  6 Cyan
  7 White
※色はPuTTY 0.56の例。各環境の実装により異なる。

付加属性

文字色と背景色を同時に指定したい場合には、値を「;」で区切ります。また文字色・背景色の他に以下の属性を付加することが出来ます。
属性番号 attributes 属性
  1 bold 太字
  2 low intensity 弱強調
  4 underline 下線
  5 blink 点滅
  7 reverse video 反転
  8 invisible text 非表示

例えば以下は、背景色=Red・文字色=Yellow・Boldで表示されます。
echo -e "\e[33;41;1mhoge\e[m"

記述の工夫

色属性のエスケープシーケンスは、他の文字列と混ぜて記述すると分かりにくくなります。次のように、色属性のエスケープシーケンスを変数に格納するとわかりやすくなります。
COLOR_1="\e[33;41;1m"
COLOR_OFF="\e[m"
echo -e "${COLOR_1}hoge${COLOR_OFF}"

また色属性のエスケープシーケンスを何度も使うような場合には、色属性の前後の文字を変数に格納しておくとわかりやすくなります(文字数は多くなってしまいますが)。
ESC="\e["
ESCEND="m"

COLOR_1="${ESC}33;41;1${ESCEND}"
COLOR_OFF="${ESC}${ESCEND}"
echo -e "${COLOR_1}hoge${COLOR_OFF}"
※自分で指摘するのもなんですが、ESCに「[」を加えた文字列を「ESC」としていたり、「m」を「ESCEND」としており、名前と実体にズレがあります。いいネーミングがあれば教えてください。


ここまでを踏まえ、実用的な関数も紹介しておきます。※(コメント以外の)画面出力をログファイルに書き込む機能つきです。
# echoの装飾用
ESC="\e["
ESCEND=m
COLOR_OFF=${ESC}${ESCEND}

echoBlank() {
	echo "" | tee -a ${LOG}
}
echoNomal() {
	echo "${1}" | tee -a ${LOG}
}
echoComment() {
	# 文字色:Black Bold(灰色)
	echo -en "${ESC}30;1${ESCEND}"
	echo "${1}"
	echo -en "${COLOR_OFF}"
}
echoAlert() {
	# 文字色:Red
	echo -en "${ESC}31${ESCEND}"
	echo "${1}" | tee -a ${LOG}
	echo -en "${COLOR_OFF}"
}
echoImportant() {
	# 文字色:Yellow
	echo -en "${ESC}33${ESCEND}"
	echo "${1}" | tee -a ${LOG}
	echo -en "${COLOR_OFF}"
}

プロンプトに応用することも出来ます。


背景色や前景色・BoldやBlink指定などがどのように表現されるかは、端末の実装や個人の設定に依存します。次のページ「シェル - echoで文字に色をつける その2」では、比較的メジャーな端末である「PuTTY 0.56」での表現について具体的に説明します。


参考URL

2011/06/07