きり丸の技術日記

技術検証したり、資格等をここに残していきます。

echoコマンドで文字色や背景色を変更する

echoコマンドで出力する文字色や、背景色を変更できることを知っていましたか?こちらを覚えると、正常終了時には緑色で完了メッセージ、異常終了時には赤色で異常メッセージを出力することで、シェルの終了を視覚で検知することができます。

今回の記事では、echoコマンドで文字や背景を変更する方法について記載します。なお、今回の記事はターミナルに対して有効な処理なため、Python等々のprint文で色付けする際にも使用できるようです。

環境

  • Bash
  • GitHub Codespaces
    • Linux version 5.4.0-1047-azure

方法

echoコマンドに、色のANSIエスケープシーケンスを入力すると、エスケープシーケンス以降の文字色・背景色を変更することができます。

echo -e "\e[31m赤い文字\e[m"

解説

構文

文字色・背景色を変更する構文は以下の通りです。

ESC[{文字色・背景色のコード1;2;...}m

コードについて

コードで指定できる色については、次の通りになります。

文字色 背景色
30 40
31 41
32 42
33 43 黄色
34 44
35 45 マゼンダ
36 46 シアン
37 47

255色を指定したり、RGBを指定することもできますが、対応しているターミナルによって左右されるので、特に解説はしません。

文字を太字等にすることもできます。こちらもターミナルによって対応してないことがありますので、確認してから使ってください。

コード 内容
0 指定をリセットし未指定状態に戻す(0は省略可)
1 太字
2 薄く表示
3 イタリック
4 アンダーライン
5 ブリンク
6 高速ブリンク
7 文字色と背景色の反転
8 表示を隠す(コピペ可能)
9 取り消し

複数のコードを適用する

セミコロンで複数のコードを指定することができます。

echo -e "\e[31m赤文字で緑背景色"
echo -e "\e[31;1m赤文字で緑背景色"
echo -e "\e[31;42m赤文字で緑背景色"

有効範囲

この構文以降の文字色・背景色を変更します。例えば、次のコマンドでは「31」にて文字色を赤くします。次の「42」にて、文字色が赤のまま、背景色を緑に変更します。文字色等を何も指定しない=「0」が入力されている場合は、文字色・背景色がリセットされます。

echo -e "\e[31m赤い文字\e[42m緑の背景色\e[m文字色リセット"

基本的には、色を変更した後は最後にリセットしましょう。シェルで実行した際に、指定していない箇所まで色の変更がされてしまいます。

#!/bin/bash
echo -e "\e[31m赤色を指定"
echo "色を指定しない"
echo -e "\e[32m緑色を指定"

ただ、どこまでがコマンドで、どこからか文字か分かりづらくなってしまうので、メッセージを別ファイルにする、変数にする等で対応すると見やすくなるでしょう。Functionを作る方法も良いです。

echo -e "\e[33m$(cat result.txt)\e[m"
result=************完了しました***************
echo -e "\e[33m$result\e[m"
echo -e "\e[33m$(echo $result)\e[m"

ESCを入力する方法

ESCを直接入力することは難しいので、「\e」や「\033」のどちらかで代用します。この記事では「\e」で統一します。次のコマンドは同じものを指します。

echo -e "\e[31m赤い文字\e[m"
echo -e "\033[31m赤い文字\033[m"

-eオプションについて

echo のeオプションを付けることによって、ANSIエスケープシーケンスを解釈することができるようになります。

echo "\e[31m赤い文字\e[m"

ソースコード

終わりに

地味ながら、結果が分かりやすく表示できるのは嬉しいものです。まぁ、工数をかけてまで色を変更したい、なんて要望はないのですが。

個人の好みのターミナルの背景色とかありますから、万人に使いやすい色とかありませんしね。Linuxの操作をする際に1号機のターミナルは緑、2号機のターミナルは赤にする等で誤操作を行わないようにすることもあるので、なかなか難しいです。

ぜひシェルをちょっとでも快適にしたい時にご活用ください。

参考情報