这个问题与众多潜在的重复问题不同,我无法找到这个特定的问题得到回答甚至被问到......
也许我在这里忽略了一些简单的逻辑,但我遇到了以下问题:
我正在尝试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
?
答案 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的评论!