在Bash布尔表达式中使用变量

时间:2017-10-19 15:22:21

标签: bash

有人可以解释如何执行布尔运算并将它们存储在Bash中的变量中吗?

我试过了:

A=true
B=false
C=!$A
D=$A && $B
echo $C
echo $D

我也试过没有钱,[],{},()......怎样才能在bash中做这么简单的操作?

控制台中的

结果是:

!true
true

似乎它们总是被视为字符串。

3 个答案:

答案 0 :(得分: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)中具有特殊含义,它会导致历史记录扩展。为了防止它,我们必须用反斜杠来逃避它,或引用它。

答案 1 :(得分:1)

不幸的是,bash不支持具有正确含义的布尔变量。在编程语言中没有“真实”和“假”常量。相反,/bin/true/bin/false是两个可执行文件,除了返回退出状态0或1之外不执行任何操作。与常见逻辑相反,退出状态0是“true”的synonim,1是synonim因为“假”。你可以得到最接近评估布尔表达式的是

  • [[ expr ]]根据评估expr
  • 返回退出状态0或1
  • &&||(这些是条件取决于最后一个命令的退出状态)
  • [实际上是一个可执行文件,其名称(不是bash的一部分)支持一些基本表达式
  • if...elif..else..fi您可以利用它来操纵工作流程中的变量

答案 2 :(得分: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