2017-10-19 55 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以外不執行任何操作。與常見邏輯相反,退出狀態0是synonim for「true」,1是synonim for「false」。你可以去評估布爾表達式最接近的是要麼

  • [[ expr ]]返回根據評估expr
  • &&|| 0或1的退出狀態(這些都是取決於最後一個命令的退出狀態條件語句)
  • [這實際上是一個帶有傻名稱(不是bash的一部分)的可執行文件,它支持一些基本表達式
  • if...elif..else..fi您可以使用它來優化操作工作流中的變量
+1

如果您將'0'看作*成功*和非零作爲*失敗*,而不是邏輯真值,那麼它就不是一個矛盾。 '''確實是一個愚蠢的名字;它的「真實」名字是'test'。 (''bash'不會在性能方面內部實現''''/'test')。 – chepner

2

你推導出正確的,bash變量默認包含字符串,其值被視爲字符串。

可以使用declare內置命令明確地說,他們存儲整數(declare -i myintvar),或索引的數組(declare -a myarr),或者關聯數組(declare -A mymap)等,但不是布爾

你可以得到布爾值最接近的是用整數值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)) 

這是說((..))$((..))的更長的路。它們都強制給出表達式的算術評估。

請注意,!在大多數shell(包括bash)中都有特殊含義,它會導致歷史擴展。爲了防止它,我們必須用反斜槓或引用它來避開它。

+0

我會避免整數屬性;它並沒有真正提供任何價值。你的'聲明'命令不會做你的想法; '||'被視爲普通的shell運算符,所以'B'只有在'declare -i E = A'失敗時纔會執行。您需要引用下面的值:'declare -i E =「A || B」'來達到模擬E = $((A || B))的預期效果。 – chepner

+0

謝謝,我錯過了那裏的報價。請注意,'declare -i'將expr評估爲算術。 – randomir

+0

所以'E = $((A || B))',這更明確,更標準。 – chepner