Edited at

bash で boolean を使った if 文 (条件分岐)

More than 1 year has passed since last update.

シェルスクリプトを書いているときに boolean を使って条件分岐させたいときにはまった罠について残しておきます。


まとめ



  • if [ 条件式 ]; = if test 条件式; と同じ


  • test truetest 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 条件式; と同様

http://tldp.org/LDP/abs/html/testconstructs.html


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 truetest 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


参考資料