bash中的多个AND条件是否基于OR条件分隔符独立工作?

时间:2016-06-28 18:04:37

标签: bash if-statement operators

这个问题与众多潜在的重复问题不同,我无法找到这个特定的问题得到回答甚至被问到......

也许我在这里忽略了一些简单的逻辑,但我遇到了以下问题:

我正在尝试if语句,其中必须满足条件,例如$V1$V2为TRUE ||或$V3$V4为真。这是一个简单的测试:

#!/bin/bash

V1="File Placeholder"
#echo $V1
V2="May contain some text"
#echo $V2

V3="Some command output"
#echo $V3
V4="Command output contains this text"
#echo $V4

if [[ "$V1" ]] && [[ "$V2" == *"contain some"* ]] || [[ "$V3" ]] && [[ "$V4" == *"output contains"* ]]
then
echo "Hello $V1"
echo "World full of: $V2"
fi 

意思是,如果出现以下情况,我想做点什么:

$V1为真(文件存在) 和 $V2为真(找到一些字符串)

OR

$V3为真(即非空) 和 $V4为true(命令输出包含文本)

它似乎有点工作,但我意识到它不能正常工作:如果第二个&&条件都为FALSE,它将不会返回TRUE,即:|| [[ "$V6" ]] && [[ "$V4" == *"output contains"* ]](为什么我认为我可能是忽视一些逻辑,也许会以某种方式取消?)。

为什么这不起作用,因为我认为它会if a AND b are TRUE ... OR ... if x AND z are TRUE

3 个答案:

答案 0 :(得分:1)

布尔条件只要有足够的信息来满足测试就会停止处理。所以,如果你有类似true && false && true的东西,那么永远不会达到最后的真实。一个错误足以让人知道整个测试都是错误的,因为你必须拥有所有的真理。

您可以尝试添加(),为每个创建一个子shell。这应该有效地将测试组合在一起,并允许更大的测试分开:

if ( [[ "$V1" ]] && [[ "$V2" == *"contain some"* ]] ) || ( [[ "$V3" ]] && [[ "$V4" == *"output contains"* ]] )
then
    echo "Hello $V1"
    echo "World full of: $V2"
fi

重要的是要记住将你的条件分开。

答案 1 :(得分:1)

您应该使用此代码段将&&个条件组合在一个[[ ... ]]中。

if [[ -n $V1 && $V2 == *"contain some"* ]] || [[ -n $V3 && $V4 == *"output contains"* ]]
then
   echo "Hello $V1"
   echo "World full of: $V2"
fi

答案 2 :(得分:0)

我最终选择使用评估顺序' @Lino首先评论了这个答案,引用了这个答案中的第三个例子groups of compound conditions in Bash test

DT[, r := {
   z = month(date) + year(date)*12
   res = (z - z[1L])/12
   as.integer( replace(res, res %% 1 != 0, NA) ) 
}, by=id]

如果出于某种原因这是一种糟糕的方法,我将不胜感激。

我喜欢它是如何包含在单个if [[ "$V6" && "$V2" == *"contain some"* || ( "$V3" && "$V4" == *"output contains"* ) ]] then echo "Hello $V1" echo "World full of: $V2" fi 双括号中的,并且仍然可读。

所有答案和评论都非常有帮助和启发! @DKing's answer建议使用[[ ]]@anubhava's answer干净地结合这些陈述,以及所有@Chepner的评论!