有人可以解释如何执行布尔运算并将它们存储在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