Bashのクイックブールプライマー
if
文は、引数としてコマンドを受け取り(そうであるように&&
、||
など)。コマンドの整数の結果コードはブール値(0 / null = true、1 / else = false)として解釈されます。
このtest
ステートメントは、演算子とオペランドを引数として取り、と同じ形式で結果コードを返しますif
。test
ステートメントのエイリアスはです[
。これはif
、より複雑な比較を実行するためにしばしば使用されます。
true
そしてfalse
ステートメントは、何もしないし、結果コードを返します(0と1、それぞれ)。そのため、Bashではブールリテラルとして使用できます。しかし、文字列として解釈される場所にステートメントを配置すると、問題が発生します。あなたの場合:
if [ foo ]; then ... # "if the string 'foo' is non-empty, return true"
if foo; then ... # "if the command foo succeeds, return true"
そう:
if [ true ] ; then echo "This text will always appear." ; fi;
if [ false ] ; then echo "This text will always appear." ; fi;
if true ; then echo "This text will always appear." ; fi;
if false ; then echo "This text will never appear." ; fi;
これはecho '$foo'
vsのようなものに似ていますecho "$foo"
。
test
ステートメントを使用する場合、結果は使用する演算子によって異なります。
if [ "$foo" = "$bar" ] # true if the string values of $foo and $bar are equal
if [ "$foo" -eq "$bar" ] # true if the integer values of $foo and $bar are equal
if [ -f "$foo" ] # true if $foo is a file that exists (by path)
if [ "$foo" ] # true if $foo evaluates to a non-empty string
if foo # true if foo, as a command/subroutine,
# evaluates to true/success (returns 0 or null)
つまり、単に合格/不合格(別名「true」/「false」)としてテストしたい場合は、大括弧なしでコマンドをif
or &&
などのステートメントに渡します。複雑な比較の場合は、適切な演算子で角かっこを使用します。
そして、はい、私はBashにネイティブのブール型などがないことを知っています。そしてif
、[
それtrue
は技術的には「コマンド」であり、「ステートメント」ではありません。これは非常に基本的な機能説明です。