2017-12-11 3 views
0

私は狂っていますか?私はブール変数を反転したい。私はこれを思いついた:フィッシュシェル:ブール値を反転する

function toggle_light_colorscheme 
    if eval $LIGHT_COLORSCHEME 
    set -U LIGHT_COLORSCHEME false 
    else 
    set -U LIGHT_COLORSCHEME true 
    end 
end 

魚はブーリアンも持っていますか?私はそうは思わない。しかし、それはfalsetrueコマンドを持っています。私はmanです。とにかく、私はブール値を必要としないかもしれません。私がしたいのは、グローバル変数を設定することです。設定すると、私は魚やvimで明るい配色を使用しているということになります。それが設定されていない場合、私は暗いものを使用しています。

set -U LIGHT_COLORSCHEME (not $LIGHT_COLORSCHEME) 

答えて

4

魚もブール値を持っています:私はのようなものが欲しかった、これを行うための簡単な方法がなければなりませんか?

いいえ実際には、それが触発されたPOSIXシェルのように、実際には全くタイプを持っていません。すべての変数は文字列のリストです。

しかし、それははい

偽と真のコマンドがあります。これらのコマンドはそれぞれ1と0を返します。すべての戻り状況!= 0はエラーコードとみなされ、したがってfalseであり、0は真です(この点ではCの逆です)。

私がしたいのは、グローバル変数を設定すると、私が魚とヴィムで明るい配色を使用していることを意味します。それが設定されていない場合、私は暗いものを使用しています。

確かに、それは動作させることができます。これについてはいくつかの異なる方法があります。変数があるという事実を使用して、それが真であることを示す要素を使用するか、それを使用します。 1.

前者は

# Check if variable is "true" by checking if it has an element 
if set -q LIGHT_COLORSCHEME[1] 
# ... 
# Flip the variable 
set -q LIGHT_COLORSCHEME[1]; and set -e LIGHT_COLORSCHEME[1]; or set LIGHT_COLORSCHEME 1 

のように働くだろう(もちろん、あなたも「フリップ」機能を作ることができます - 残念ながら、コマンドの戻りステータスではなく、変数の値に作用するキーワードである「ない」)

後者は、私はこの思い付いた

if test "$LIGHT_COLORSCHEME" = 1 # the "=" here tests string-equality, but that shouldn't matter. 
# ... 
# Flip the variable 
test "$LIGHT_COLORSCHEME" = 1; and set LIGHT_COLORSCHEME 0; or set LIGHT_COLORSCHEME 1 

次のようになります。

機能toggle_light_colorscheme のeval $ LIGHT_COLORSCHEME

もしあなたは何をするかeval誤解しています。引数をコードとして実行します。私。コマンドとしてLIGHT_COLORSCHEME の値を実行しようとします。ですから、もしあなたが$ PATHのどこかに "1"というコマンドがあれば、それは実行されます!

条件をテストするには、testを使用してください。

+0

ありがとう、私は後者の例を使っています。違いは、変数を永続させたいので、普遍的なものでなければなりません。 –

+2

巧妙なトリックは、 'test'とその終了値を使うことです: ' ["$ LIGHT_COLORSCHEME" -eq 1]; set LIGHT_COLORSCHEME $ status; ' ブール値が1のときは(ブール== 1)は「真」(ゼロ)、0のときは偽です。 –