2017-10-19 13 views
1

ブール演算の実行方法をBashの変数に格納する方法を説明できる人はいますか?Bashブール式の変数の使用

私が試した:

A=true 
B=false 
C=!$A 
D=$A && $B 
echo $C 
echo $D 

を[]、()、{}を持つと私はまた、ドルなしで試してみました...どのようにしてbashで、このような簡単な操作を行うことができますか?コンソールで

結果は以下のとおりです。

!true 
true 

彼らが常に文字列として扱われそうです。

+0

P.S.多かれ少なかれ、私はbashを使います。 – Machupicchu

答えて

0

このような?

t=true 
f=false 

# if $t; then echo Hi; fi 
Hi 
# if $f; then echo Hi; fi 
# if ! $f; then echo Hi; fi 
Hi 
# if ! ($t && $t); then echo Hi; fi 
# if ($t && $t); then echo Hi; fi 
Hi 
1

残念ながら、bashは不適切な変数を適切な意味でサポートしていません。プログラミング言語のように "真の"定数と "偽の"定数はありません。代わりに/bin/true/bin/falseは、戻り値の終了ステータス0または1以外の何もしない2つの実行可能ファイルです。一般的な論理とは異なり、終了ステータス0は "true"のsynonimであり、1は "false"のsynonimです。あなたはブール式を評価し得ることができる最も近いexpr

  • &&||の評価に応じて、終了ステータス0または1を返し

    • [[ expr ]](これらは最後のコマンドの終了ステータスに応じて条件分岐している)
    • のいずれかであります[実際にはいくつかの基本式をサポートする愚かな名前(bashの部分ではない)を持つ実行可能ファイルです
    • if...elif..else..fiワークフロー内の変数を操作するのに便利です
  • +1

    論理的な真理ではなく、「成功」として「0」、*失敗*として非ゼロを考えると、矛盾は少なくなります。 '['は実際には愚かな名前です。実際の名前は 'test'です。 ( 'bash'はパフォーマンス上の理由から内部的に' ['/' test'を実装しています。) – chepner

    2

    デフォルトでは、変数には文字列が含まれており、その値は文字列として扱われます。

    あなたは、組み込みコマンド、彼らは、などの整数(declare -i myintvar)、またはインデックス付きの配列(declare -a myarr)、または連想配列(declare -A mymap)を、保存しかしをブールない明示的に言ってdeclareを使用することができます。

    あなたはブールに得ることができる最も近い整数を使用することですが01値と((expr))コマンド(bash固有)と、またはarithmetic expansion $((expr))(POSIX互換)で算術式として式を評価します。これらのコマンドは、shell arithmeticの規則に従ってexprを評価します。例えば

    A=1 
    B=0 
    ((C = \!A))  # logical negation ==> C = 0 
    ((D = A && B)) # logical AND  ==> D = 0 
    E=$((A^B))  # bitwise XOR  ==> E = 1 
    

    bashで、あなたもdeclare -iletを使用することができます。

    declare -i E='A||B' # equivalent to: E=$((A||B)), or ((E=A||B)) 
    let C='!A'    # equivalent to: C=$((\!A)), or ((C=\!A)) 
    

    ((..))$((..))を言うの長い道です。彼らは両方とも与えられた式の算術評価を強制します。

    !は、ほとんどのシェル(bashを含む)では特別な意味を持ちますが、履歴拡張が行われることに注意してください。それを防ぐには、バックスラッシュでエスケープするか、引用符で囲む必要があります。

    +0

    整数属性は避けます。それは本当に価値を提供していません。あなたの 'declare'コマンドは、あなたが思うことをしません。 '||'は通常のシェル演算子として扱われるので 'B'は' declare -i E = A'が失敗したときにのみ実行されます。 'E = $((A || B))'をシミュレートする意図の効果を得るには、 'declare -i E =" A || B "'という値を引用する必要があります。 – chepner

    +0

    ありがとう、私はそこに引用符を逃した。 'declare -i'はexprを算術として評価することに注意してください。 – randomir

    +0

    'E = $((A || B))'も同様に標準であるだけでなく、より明示的です。 – chepner