シェルスクリプト 文字列比較と「等式の性質」

次のような文字列を比較するプログラム a.sh を考えます。

#!/bin/sh

A="abc"
B="abc"

if [ $A = $B ]; then
    echo "A=B"
else
    echo "A!=B"
fi

結果

$ ./a.sh
A=B

Bを例えば "def" に変えると、else 側 の echo で「A!=B」と表示します。

ここで、A か B が値を取らないとしましょう。

#!/bin/sh

A="abc"
B=

if [ $A = $B ]; then
    echo "A=B"
else
    echo "A!=B"
fi

すると、結果は

$ ./a.sh
./a.sh: 6 行: [: abc: 単項演算子が予期されます
A!=B

のようになります。
結果は正しそうですが、警告が表示されるので気持ち悪いです。


これを解決するにはどうすれば良いでしょうか。
そうです。
そこで「等式の性質」の出番です。

等式の性質は、

A = B

が成り立つとき、

A + C = B + C
A - C = B - C
A * C = B * C
A / C = B / C

が成り立つ。

というものです。
中学校の数学で確か習いましたよね?

では文字列の場合はというと、
四則演算はできませんが同じ文字を両辺に足しても等式は成り立ちますよね?
つまり、

#!/bin/sh

A="abc"
B=

if [ "X$A" = "X$B" ]; then
    echo "A=B"
else
    echo "A!=B"
fi

のように書き換えます。
実行してみましょう。

$ ./a.sh
A!=B

はい。警告は出なくなりましたね。

このように、変数が値を取らないケースがある場合は、
「等式の性質」を利用して両辺に文字を加えることで警告表示を回避することができます。