シェルスクリプトで出力に色付けをする簡単な方法

ブログ

こんにちは、山田ハヤオです。

唯一できるプログラミング言語がシェルスクリプトだったりします。

(HTMLとかCSSとかPHPも多少はできるのですが基礎しかわからず…)

ところで、Linuxを使っていると色付けされたコマンドをよく見かけます。

AlterLinuxのビルドもこのように色付けしています。

スポンサーリンク

本来の色付けの仕方

基本的には8色を出力することができます。

ターミナルにechoで色のついた文字を出力する[サンプルスクリプトあり]

上記のサイトに256色を出力する方法も解説されていますが、互換性が低いため使用しないほうが良いでしょう。

本来の方法で「文字色をシアンにして出力する」場合は以下のようになります。

echo -e "\e[;36mTest\e[m"

正直なところ「記号ばっかで読みにくいやんけクソが」といったところでしょう。

そこでこの問題を解決する関数を作成しました。

簡単に使える関数

2種類作成しました。

2つの違いは色の名前をそのまま指定できるかどうかの違いだけです。

ロング版

#!/usr/bin/bash

# Color echo
# usage: echo_color -b <backcolor> -t <textcolor> -d <decoration> [Text]
#
# Text Color
# 30 or Black
# 31 or Red
# 32 or Green
# 33 or Yellow
# 34 or Blue
# 35 or Magenta
# 36 or Cyan
# 37 or White
#
# Background color
# 40 or Black
# 41 or Red
# 42 or Green
# 43 or Yellow
# 44 or Blue
# 45 or Magenta
# 46 or Cyan
# 47 or White
#
# Text decoration
# 0 => All attributs off (ノーマル)
# 1 => Bold on (太字)
# 4 => Underscore (下線)
# 5 => Blink on (点滅)
# 7 => Reverse video on (色反転)
# 8 => Concealed on


echo_color() {
    local backcolor
    local textcolor
    local decotypes
    local echo_opts
    local arg
    local OPTIND
    local OPT

    echo_opts="-e"

    while getopts 'b:t:d:n' arg; do
        case "${arg}" in
            b) backcolor="${OPTARG}" ;;
            t) textcolor="${OPTARG}" ;;
            d) decotypes="${OPTARG}" ;;
            n) echo_opts="-n -e"     ;;
        esac
    done

    shift $((OPTIND - 1))

    case "${backcolor}" in
        "black"   | "Black"   ) backcolor="40" ;;
        "Red"     | "red"     ) backcolor="41" ;;
        "Green"   | "green"   ) backcolor="42" ;;
        "Yellow"  | "yellow"  ) backcolor="43" ;;
        "Blue"    | "blue"    ) backcolor="44" ;;
        "Maganta" | "maganta" ) backcolor="45" ;;
        "Cyan"    | "cyan"    ) backcolor="46" ;;
        "White"   | "white"   ) backcolor="47" ;;
        "40" | "41" | "42" | "43" | "44" | "45" | "46" | "47" ) : ;;
    esac

    case "${textcolor}" in
        "black"   | "Black"   ) textcolor="30" ;;
        "Red"     | "red"     ) textcolor="31" ;;
        "Green"   | "green"   ) textcolor="32" ;;
        "Yellow"  | "yellow"  ) textcolor="33" ;;
        "Blue"    | "blue"    ) textcolor="34" ;;
        "Maganta" | "maganta" ) textcolor="35" ;;
        "Cyan"    | "cyan"    ) textcolor="36" ;;
        "White"   | "white"   ) textcolor="37" ;;
        "30" | "31" | "32" | "33" | "34" | "35" | "36" | "37" ) : ;;
    esac


    echo ${echo_opts} "\e[$([[ -v backcolor ]] && echo -n "${backcolor}"; [[ -v textcolor ]] && echo -n ";${textcolor}"; [[ -v decotypes ]] && echo -n ";${decotypes}")m${@}\e[m"
}

不要な場合はコメントを削除してしまっても結構です。

上の関数をファイルで読み込むか、貼り付けるかをしてシェルスクリプト内で使用できるようにして下さい。

以下のように使用できます。

echo_color [Option] Text

オプション

オプションは以下があります。全て省略できます。

オプション 使い方
-d [数字] デコレーションの種類を指定します。(;で複数指定可能)
-b [色] 背景色を指定します。(色番号or色名)
-t [色] 文字色を指定します。(背景色と同様)
-n 最後に改行を行いません。

色の指定

色名は以下の英語が使用できます。

色名(日本語) 色名(英語)
black
red
green
黄色 yellow
blue
マゼンタ maganta
シアン cyan
white

ショート版

# Color echo
# usage: echo_color -b <backcolor> -t <textcolor> -d <decoration> [Text]
#
# Text Color
# 30 => Black
# 31 => Red
# 32 => Green
# 33 => Yellow
# 34 => Blue
# 35 => Magenta
# 36 => Cyan
# 37 => White
#
# Background color
# 40 => Black
# 41 => Red
# 42 => Green
# 43 => Yellow
# 44 => Blue
# 45 => Magenta
# 46 => Cyan
# 47 => White
#
# Text decoration
# 0 => All attributs off (ノーマル)
# 1 => Bold on (太字)
# 4 => Underscore (下線)
# 5 => Blink on (点滅)
# 7 => Reverse video on (色反転)
# 8 => Concealed on

echo_color() {
    local backcolor
    local textcolor
    local decotypes
    local echo_opts
    local arg
    local OPTIND
    local OPT

    echo_opts="-e"
    while getopts 'b:t:d:n' arg; do
        case "${arg}" in
            b) backcolor="${OPTARG}" ;;
            t) textcolor="${OPTARG}" ;;
            d) decotypes="${OPTARG}" ;;
            n) echo_opts="-n -e" ;;
        esac
    done
    shift $((OPTIND - 1))
    echo ${echo_opts} "\e[$([[ -v backcolor ]] && echo -n "${backcolor}"; [[ -v textcolor ]] && echo -n ";${textcolor}"; [[ -v decotypes ]] && echo -n ";${decotypes}")m${@}\e[m"
}

関数本体の行数は21行とかなりシンプルになっています。

オプション等はロング版と一緒ですが、文字色や背景色を色名では指定できません。

オプション

「色を英名で指定できない」という点以外はロング版と一緒です。

色名

ショート版では背景色と文字色で色が異なります。詳細はコメントを参照して下さい。

最後に

いかがだったでしょうか?

この関数は関数内でgetoptsを使用していますが、関数の外でgetoptsを使用しているスクリプトでも使用できます。

もし不具合や改善点がありましたらコメントまでお願いします。

コメント

タイトルとURLをコピーしました