如果一个标志设置为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]];
这不是我想要做的。所以我的问题是进行这样比较的最佳方法是什么,以及为什么我希望通过的几个测试用例根本没有?
谢谢!
答案 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)
true
和false
被评估为字符串;)
[[ $var ]]
相当于[[ -n $var ]]
,用于检查$var
是否为空。
然后,无需在[[
内引用您的变量。请参阅this reminder。
最后,here is an explication of the difference between &&
inside brackets and outside。
答案 3 :(得分:4)
shell本身没有布尔变量。但是,命令分别名为true
和false
,退出状态分别为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
希望这有帮助。