この質問にはすでに回答があります:
回答
回答
「true」と「false」は、それぞれ成功と失敗を返すだけのコマンドでもあるため、よく使用します。次に、次のことができます
if "$phone_missing"; then ...
回答
これが1つの方法ですこれは、真/偽の値を保持しながらです。
phone_missing=false if [ "$phone_missing" != false ]; then echo "phone_missing is not "false" (but may be non-true, too)" fi if [ "$phone_missing" == true ]; then echo "phone_missing is true." fi
二重引用符$phone_missing
は、変数phone_missing
がまったく定義されていない場合から保護するためのものです。これを防ぐもう1つの一般的なイディオムは[ x$phone_missing != xfalse ]
ですが、引用符は私にはもっと自然に思えます。
ヒントは、iv id = “のbash
ヘルプページにあります。 333a76237e “>
:
STRING True if string is not empty. ... ! EXPR True if expr is false.
したがって、基本的に[ $foo ]
は、$foo
が空でない場合に真になります。真または偽ではなく、空ではありません。[ ! $foo ]
は、$ fooが空または未定義の場合に真になります。
コードを変更して、phone_missing
を非に設定することができます。 -空の値e、これは真を示します。 phone_missing
が設定されていない(または空— phone_missing=""
)場合、falseになります。それ以外の場合は、文字列テスト演算子(=
および!=
)を使用する必要があります。
その他のわずかな問題は割り当て。 $phone_missing=true
として使用しますが、phone_missing=true
(ドル記号なし)にする必要があります。
申し訳ありません。少し密集していますが、それは私がいるからです。長い一日でした。 🙂
他の回答で解決策が得られましたが、元の考え方の何が悪かったのかを説明します。
Bash変数には型がないため、ブール変数やtrueやfalseのような値などはありません。基本的に、すべてのbash変数は単なる文字列です。
テストのタイプを指定せずにbashで変数/文字列をテストする場合(-n
または-z
)、デフォルトで-n
(長さがゼロ以外の文字列)テストになります。
つまり、[ "$var" ]
は[ -n "$var" ]
と同等です。 $var
に少なくとも1文字が含まれている限り、trueと評価されました。
式を否定したため、[ ! "$var" ]
は[ ! -n "$var" ]
と同等です。したがって、$var
に少なくとも1文字が含まれている場合、式はfalseになります。
false
(文字列)に5文字が含まれている場合、式はfalseです。 phone_missing
を(true
、0、1)に設定した文字列が重要でない場合、式は常にfalse
はphone_missing
の長さがゼロ以外であるため、true
にする唯一の方法は長さがゼロであるため。
ブール値に文字列を使用しないでください。整数を使用します。
入力:
val=1 ((val)) && echo "true" || echo "false" val=0 ((val)) && echo "true" || echo "false"
出力:
true false
ソース:
((式))
式は、以下の算術評価で説明されているルールに従って評価されます。式の値がゼロ以外の場合、戻りステータスは0です。それ以外の場合、戻りステータスは1です。これはlet “expression”とまったく同じです。
これは、Jamesをサポートするためのコメントとして行いました。 Koだが、コメントしたり、公に投票したりする担当者がいなかった。
ここでの問題は、[]括弧が、値や文字列の同等性などの比較テストを実行するための表記であるということです。
空の文字列に対するbashの文字列の真実性は""
(空の文字列)はfalse(戻り値1)と評価され、空でない文字列は “false” “true “または” bob “s your uncle”はtrueと評価されます(戻り値0)。
これは次の方法で証明できます:
if [ "foo" ]; then echo true is $?; else echo false is $?; fi
上記の$?
は、最後のコマンドの終了ステータス(0成功、エラーコードの場合は> 0)を保持し、true is 0
。"foo"
は任意のものに置き換えることができ、空の文字列""
または""
の場合、else条件を評価し、false is 1
を出力します。
[を使用する場合]は、!$ phone_missingが評価され、trueの場合は0
、falseの場合は1
などの内部ステートメントをifcontroに返します。 lステートメント。角かっこは文字列と値の比較を評価するため、$ phone_missingは最初に空でない文字列 “false”に展開され、[]によって空でない文字列(またはtrue)として評価され、次に!結果を反転して、ifステートメントがfalse(または戻り値1)を取得し、elseステートメントが存在する場合はそれを実行する条件付き本文をスキップします。
James Koが言ったように、表記は単に「ブール値」をif制御ステートメントに保持する変数。 注 bashでは、ブール値のtrueとfalseは、次のように小文字にする必要があります。bool_true= true bool_false = falseその他の場合はブール値ではなく文字列として評価します。
したがって、例とJames Koの回答を使用すると、次のようになります。
phone_missing=false echo "missing $phone_missing" if ! $phone_missing then echo "Lost phone at $readabletime" $phone_missing=true fi
または私として読みやすさを優先します(構文的に同じで、James Ko “s)
phone_missing=false echo "missing $phone_missing" if ( ! $phone_missing ); then echo "Lost phone at $readabletime" $phone_missing=true fi
Alexiosなどの他の回答は、文字列の内容を文字通りチェックしています。そのため、次のいずれかがfalseになります。
phone_missing=false if [ "$phone_missing" != false ]; then echo "phone_missing is not "false" (but may be non-true, too)" fi if [ "$phone_missing" == true ]; then echo "phone_missing is not "false" (but may be non-true, too)" fi if [ "$phone_missing" == Bobs_your_uncle ]; then echo "phone_missing is not "false" (but may be non-true, too)" fi
正しい構文はif ! $bool; then [statements]; fi
です。
例:
bool=false if ! $bool; then echo "This is correct!" fi if [ ! $bool ]; then echo "This is wrong!" fi
出力:This is correct!
コメント