シェルスクリプトを書いているときに boolean を使って条件分岐させたいときにはまった罠について残しておきます。
まとめ
-
if [ 条件式 ];
=if test 条件式;
と同じ -
test true
もtest false
も true になる - boolen を使った条件式は
if "${boolean}";
を使おう
boolean 値は if [ "${boolean}" ]; で判定できない
下記のようなコードを書いて条件分岐をさせようとしていました。
#!/bin/bash
readonly is_true=true
readonly is_false=false
if [ "${is_true}" ]; then
echo 'is_true'
fi
if [ "${is_false}" ]; then
echo 'is_false'
fi
出力結果
$ sh boolean_test.sh
is_true
is_false
どちらも出力されてしまってます。
if [ 条件式 ]; は if test 条件式; と同様
There exists a dedicated command called [ (left bracket special character). It is a synonym for test, and a builtin for efficiency reasons.
と書かれているように
if [ 条件式 ];
と if test 条件式;
は同義です。
そして test true
も test false
も両方trueになります
$ test true
$ echo $?
0
$ test false
$ echo $?
0
なので両方出力されてたんですね
解決策 if "${boolean}"; を使おう
#!/bin/bash
readonly is_true=true
readonly is_false=false
if "${is_true}"; then
echo 'is_true'
fi
if "${is_false}"; then
echo 'is_false'
fi
出力結果
$ sh boolean_test.sh
is_true