ブール演算の実行方法をBashの変数に格納する方法を説明できる人はいますか?Bashブール式の変数の使用
私が試した:
A=true
B=false
C=!$A
D=$A && $B
echo $C
echo $D
を[]、()、{}を持つと私はまた、ドルなしで試してみました...どのようにしてbashで、このような簡単な操作を行うことができますか?コンソールで
結果は以下のとおりです。
!true
true
彼らが常に文字列として扱われそうです。
ブール演算の実行方法をBashの変数に格納する方法を説明できる人はいますか?Bashブール式の変数の使用
私が試した:
A=true
B=false
C=!$A
D=$A && $B
echo $C
echo $D
を[]、()、{}を持つと私はまた、ドルなしで試してみました...どのようにしてbashで、このような簡単な操作を行うことができますか?コンソールで
結果は以下のとおりです。
!true
true
彼らが常に文字列として扱われそうです。
このような?
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
残念ながら、bashは不適切な変数を適切な意味でサポートしていません。プログラミング言語のように "真の"定数と "偽の"定数はありません。代わりに/bin/true
と/bin/false
は、戻り値の終了ステータス0または1以外の何もしない2つの実行可能ファイルです。一般的な論理とは異なり、終了ステータス0は "true"のsynonimであり、1は "false"のsynonimです。あなたはブール式を評価し得ることができる最も近いexpr
&&
と||
の評価に応じて、終了ステータス0または1を返し
[[ expr ]]
(これらは最後のコマンドの終了ステータスに応じて条件分岐している)[
実際にはいくつかの基本式をサポートする愚かな名前(bashの部分ではない)を持つ実行可能ファイルですif...elif..else..fi
ワークフロー内の変数を操作するのに便利です論理的な真理ではなく、「成功」として「0」、*失敗*として非ゼロを考えると、矛盾は少なくなります。 '['は実際には愚かな名前です。実際の名前は 'test'です。 ( 'bash'はパフォーマンス上の理由から内部的に' ['/' test'を実装しています。) – chepner
デフォルトでは、変数には文字列が含まれており、その値は文字列として扱われます。
あなたは、組み込みコマンド、彼らは、などの整数(declare -i myintvar
)、またはインデックス付きの配列(declare -a myarr
)、または連想配列(declare -A mymap
)を、保存しかしをブールない明示的に言ってdeclare
を使用することができます。
あなたはブールに得ることができる最も近い整数を使用することですが0
と1
値と((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 -i
とlet
を使用することができます。
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
を含む)では特別な意味を持ちますが、履歴拡張が行われることに注意してください。それを防ぐには、バックスラッシュでエスケープするか、引用符で囲む必要があります。
整数属性は避けます。それは本当に価値を提供していません。あなたの 'declare'コマンドは、あなたが思うことをしません。 '||'は通常のシェル演算子として扱われるので 'B'は' declare -i E = A'が失敗したときにのみ実行されます。 'E = $((A || B))'をシミュレートする意図の効果を得るには、 'declare -i E =" A || B "'という値を引用する必要があります。 – chepner
ありがとう、私はそこに引用符を逃した。 'declare -i'はexprを算術として評価することに注意してください。 – randomir
'E = $((A || B))'も同様に標準であるだけでなく、より明示的です。 – chepner
P.S.多かれ少なかれ、私はbashを使います。 – Machupicchu