Bash布尔测试

时间:2014-04-27 06:27:14

标签: bash

如果一个标志设置为true而另一个标志设置为false,我试图运行一个代码块。即

var1=true
var2=false
if [[ $var1 && ! $var2 ]]; then var2="something"; fi

由于这没有评估我预期的方式,我写了几个其他测试用例,我很难理解他们是如何被评估的。

aa=true 
bb=false
cc="python"
if [[ "$aa" ]]; then echo "Test0" ; fi
if [[ "$bb" ]]; then echo "Test0.1" ; fi
if [[ !"$aa" ]]; then echo "Test0.2" ; fi
if [[ ! "$aa" ]]; then echo "Test0.3" ; fi
if [[ "$aa" && ! "$bb" ]]; then echo "Test1" ; fi
if [[ "$aa" && ! "$aa" ]]; then echo "Test2" ; fi
if [[ "$aa" ]] && ! [[ "$bb" ]]; then echo "test3" ; fi
if [[ "$aa" ]] && ! [[ "$cc" ]]; then echo "test4" ; fi
if [[ $aa && ! $bb ]]; then echo "Test5" ; fi
if [[ $aa && ! $aa ]]; then echo "Test6" ; fi
if [[ $aa ]] && ! [[ $bb ]]; then echo "test7" ; fi
if [[ $aa ]] && ! [[ $cc ]]; then echo "test8" ; fi

当我运行前面的代码块时,我得到的唯一输出是

  

TEST0
  Test0.1
  Test0.2

然而,我的期望是我会得到

  

TEST0
  Test1的
  TEST3
  TEST5
  TEST7

我试图了解运行类似测试的最佳方法,但我找到的大部分示例都是以格式设置的     如果[[“$ aa”== true]];
这不是我想要做的。所以我的问题是进行这样比较的最佳方法是什么,以及为什么我希望通过的几个测试用例根本没有?

谢谢!

5 个答案:

答案 0 :(得分:14)

没有任何运算符,[[仅检查变量是否为空。如果是,那么它被认为是假的,否则它被认为是真的。变量的内容无关紧要。

答案 1 :(得分:14)

您对shell上下文中布尔的理解不正确。

var1=true
var2=false

以上变量都是 true ,因为它们是非空字符串

您可以改为使用算术上下文:

$ a=1
$ b=0
$ ((a==1 && b==0)) && echo y
y
$ ((a==0 && b==0)) && echo y
$
$ ((a && !(b))) && echo y;       # This seems to be analogous to what you were attempting
y

答案 2 :(得分:6)

truefalse被评估为字符串;)

[[ $var ]]相当于[[ -n $var ]],用于检查$var是否为空。

然后,无需在[[内引用您的变量。请参阅this reminder

最后,here is an explication of the difference between && inside brackets and outside

答案 3 :(得分:4)

shell本身没有布尔变量。但是,命令分别名为truefalse,退出状态分别为0和1,因此可以类似于布尔值使用。

var1=true
var2=false
if $var1 && ! $var2; then var2="something"; fi

不同之处在于,不是测试var1是否设置为真值,而是将其扩展为命令的名称,该命令运行并成功。同样,var2扩展为运行和失败的命令名称,但由于它以!为前缀,因此退出状态将被反转以表示成功。

(请注意,与大多数编程语言不同,退出状态为0表示成功,因为虽然大多数命令有1种方法可以成功,但有许多不同的方法可能会失败,因此可以为不同的非零值分配不同的含义。)

答案 4 :(得分:0)

你最接近的似乎是使用函数而不是变量,因为你可以在条件中使用它们的返回状态。

$  var1() { return 0; }
$  var2() { return 1; }  # !0 = failure ~ false

我们可以这样测试

$  var1 && echo "it's true" || echo "it's false"
it's true
$  var2 && echo "it's true" || echo "it's false"
it's false

或者这样

$  if var1; then echo "it's true"; else echo "it's false"; fi
it's true
$  if var2; then echo "it's true"; else echo "it's false"; fi
it's false

希望这有帮助。