有人可以解釋如何執行布爾運算並將它們存儲在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以外不執行任何操作。與常見邏輯相反,退出狀態0是synonim for「true」,1是synonim for「false」。你可以去評估布爾表達式最接近的是要麼
[[ expr ]]
返回根據評估expr
&&
和||
0或1的退出狀態(這些都是取決於最後一個命令的退出狀態條件語句)[
這實際上是一個帶有傻名稱(不是bash的一部分)的可執行文件,它支持一些基本表達式if...elif..else..fi
您可以使用它來優化操作工作流中的變量如果您將'0'看作*成功*和非零作爲*失敗*,而不是邏輯真值,那麼它就不是一個矛盾。 '''確實是一個愚蠢的名字;它的「真實」名字是'test'。 (''bash'不會在性能方面內部實現''''/'test')。 – chepner
你推導出正確的,bash
變量默認包含字符串,其值被視爲字符串。
可以使用declare
內置命令明確地說,他們存儲整數(declare -i myintvar
),或索引的數組(declare -a myarr
),或者關聯數組(declare -A mymap
)等,但不是布爾。
你可以得到布爾值最接近的是用整數值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))
這是說((..))
或$((..))
的更長的路。它們都強制給出表達式的算術評估。
請注意,!
在大多數shell(包括bash
)中都有特殊含義,它會導致歷史擴展。爲了防止它,我們必須用反斜槓或引用它來避開它。
P.S.或多或少第一次使用bash ... – Machupicchu