2017-10-19 166 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