2016-12-09 6 views
0

トグルこれは動作しない場合は、すべての時間は、else節を実行:bashが声明は、

state=false 
function toggle { 
    if [ ! $state ] 
    then 
    echo first 
    state=true 
    else 
    echo second 
    state=false 
    fi 
} 

は、私が「第一」及び「第二」の間の交流出力を持っているでしょうtoggleを複数回呼び出す期待し、代わりに "second"だけを取得します

答えて

3

testブール値の場合はtruefalseの文字列を使用しません。 testは、空でない文字列をすべて真とし、空の文字列を偽として扱います。あなたが明示的な比較を実行する必要が

state=false 
function toggle { 
    if [ "$state" = false ] 
    then 
    echo first 
    state=true 
    else 
    echo second 
    state=false 
    fi 
} 
1

両方truefalseは、あなたのケースでは、論理trueに評価さ文字列だけ、です。

そうにかかわらず、状態が単語trueまたはfalseが含まれているかどうかについて、[ ! $state ]は常に論理falseに戻ります - あなたのelse句をトリガします。

すでにtruefalseを使用しているので、あなたが行うことができるものがあります:truefalseどちらも、何もしないが、それぞれ、0と1のエラーコードを返し、有効なシェルコマンドです。それまでに実行されるであろう、falseまたはtrueのどちらかだろう

if $state; 

$stateifは基本的にコマンドを評価([が実行可能である、それを見て)、そのエラーコードを使用しているので、あなたはこのような何かを行うことができますif、およびエラーコードに応じて、if ... else ... fiブロックの特定のコードブロックが実行されるかどうかを選択します。

+0

「-eq」は数字です。「=」は文字列です。 – Barmar

+0

あなたはそうです、とにかく全く別のものを作りました;) – chw21

+0

これは動作しますが、この_only_は '$ state'値' false'と 'true'で意図したとおりに動作することを明確にし、変数値の実行に依存しています - 何が起こっても_ _はコマンド_です。 – mklement0

0

私はどこに行ったのかわかりませんが、私の好きな答えは消えてしまったようです。

state= 
function toggle { 
    if [ ! $state ] 
    then 
    echo first 
    state=true 
    else 
    echo second 
    state= 
    fi 
}