有人可以解释如何执行布尔运算并将它们存储在Bash中的变量中吗?
我试过了:
A=true
B=false
C=!$A
D=$A && $B
echo $C
echo $D
我也试过没有钱,[],{},()......怎样才能在bash中做这么简单的操作?
控制台中的结果是:
!true
true
似乎它们总是被视为字符串。
答案 0 :(得分:2)
您推导出正确,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
)中具有特殊含义,它会导致历史记录扩展。为了防止它,我们必须用反斜杠来逃避它,或引用它。
答案 1 :(得分:1)
不幸的是,bash不支持具有正确含义的布尔变量。在编程语言中没有“真实”和“假”常量。相反,/bin/true
和/bin/false
是两个可执行文件,除了返回退出状态0或1之外不执行任何操作。与常见逻辑相反,退出状态0是“true”的synonim,1是synonim因为“假”。你可以得到最接近评估布尔表达式的是
[[ expr ]]
根据评估expr
&&
和||
(这些是条件取决于最后一个命令的退出状态)[
实际上是一个可执行文件,其名称(不是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