linux Bash脚本-if块中的布尔值?

xpcnnkqh  于 2023-03-17  发布在  Linux
关注(0)|答案(3)|浏览(152)

我尝试了这个SO post -How to evaluate a boolean variable in an if block in bash?中的代码,它不起作用。看起来BASH中没有布尔值。是否有一个完美的变通方案可以让我在BASH中设置和检查布尔值?
我的准则-

#!/bin/bash
flag=true
if [ $flag ]
echo 'True'
#flag=false
#echo 'Now changed to false' 
fi

即使第2行的flag=false,输出仍然为True。为什么?

0yg35tkg

0yg35tkg1#

尝试不使用方括号,如下所示

#!/bin/bash
flag=true
if $flag ; then
   echo 'True'
   #flag=false
   #echo 'Now changed to false' 
fi
4urapxun

4urapxun2#

因为“人的测试”的这一部分它被评估为真-

[ expression ]
         string        True if string is not the null string.

你需要用一些像-

#!/bin/bash
flag=1
if [ ${flag} -eq 1 ]
then
    echo 'True'
    #flag=0
    #echo 'Now changed to false' 
fi
tcbh2hod

tcbh2hod3#

设置

要将bash变量$subject设置为布尔值truefalse,请使用subject=truesubject=false。要将vash变量设置为空,请使用subject=subject=$()unset subject

测试

使用单括号和不使用括号是可疑的,我发现在如何计算空字符串、空值以及整数0和1的预期行为中存在一些差异。
首先,定义严格布尔测试的正确行为如下:

  • 仅当主题为布尔值true* 时,布尔值trueif测试才会计算为true*。对于1和值为'true'的任何字符串,此类测试的计算结果为false
  • 仅当主题为布尔值false* 时,falseif测试才会计算为true。对于0null和空字符串'',此类测试的计算结果为false

完成此操作的正确方法是使用双方括号,并显式地针对truefalse进行测试,如下所示:

if [[ ${subject} = true ]]; then { ... } fi  # only if boolean true
if [[ ${subject} = false ]]; then { ... } fi # only if boolean false

注意,如果你使用这样一个测试布尔真(或假),一个else块不仅会覆盖相反的条件,而且会覆盖整个可能的非布尔值false(或true)。

相关问题