こんにちは、山田ハヤオです。
唯一できるプログラミング言語がシェルスクリプトだったりします。
(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
を使用しているスクリプトでも使用できます。
もし不具合や改善点がありましたらコメントまでお願いします。
ライセンス
このページのコードは全てWTFPLでライセンスされています。
コメント