Linuxパソコン・サーバーのBash言語のコマンドライン上で使用できる”cat -A”コマンドで、変数やファイルに隠れた文字コードや文字を可視化、見えるようにする方法についてです。
一見、2つの変数は同一に見えるけど、if
で判定してみるとなぜかうまくいかない、ということがあります。
例えば、以下のような場合です。
2つの変数をecho
してみると、このように同一に見えます。
$ echo $md5_remote
8a32e4c5528d684ffc9c76899e4ec256
$ echo $md5_local
8a32e4c5528d684ffc9c76899e4ec256
こちらのほうが正確な出力が得られる書き方ですので、これも試してみます。しかし出力は同じです。
$ echo "${md5_remote}"
8a32e4c5528d684ffc9c76899e4ec256
$ echo "${md5_local}"
8a32e4c5528d684ffc9c76899e4ec256
if
でイコール判定をしてみても、やはりイコールではないと言われてしまいます。
if [[ "${md5_local}" == "${md5_remote}" ]];
then
echo y
fi
こんなとき、cat -A
でファイルの隠れた文字コードを出力するのが便利な解決策です。
$ echo "${md5_remote}" | cat -A
8a32e4c5528d684ffc9c76899e4ec256^M$
$ echo "${md5_local}" | cat -A
8a32e4c5528d684ffc9c76899e4ec256$
このように、一見同一に見られた2つの変数は、実際は同一ではなかったことがわかります。
では、変数を同一のものとしてif
判定するにはどうしたらよいのでしょうか。以下関数を使って、文字列の最初と最後の空白を取り除いてみましょう。PHPのtrim
と同様の働きをします。
trim ()
{
local var="$*";
var="${var#"${var%%[![:space:]]*}"}";
var="${var%"${var##*[![:space:]]}"}";
echo -n "$var"
}
ここでtrim
を使ってif
のイコール判定をしてみます。
if [[ "$( trim "${md5_local}" )" == "$( trim "${md5_remote}" )" ]];
then
echo y
fi
y
想定通りの結果が得られました。