在Bash脚本中,我有以下条件:
if [ $cnt -eq 1 ] && [[ $str != *"something 1"* || $str != *"something 2"* ]]
它没有按预期工作。这在巴什有可能吗?如果是这样,那么正确的语法是什么?如果$cnt -eq 1
为真且$str != *"something 1"*
或$str != *"something 2"*
为真,则if语句返回true。
答案 0 :(得分:1)
这不是语法问题,我很确定这是一个逻辑问题。除非[[ $str != *"something 1"* || $str != *"something 2"* ]]
与两个模式匹配,否则表达式$str
为真。考虑:
$ str="foo no pattern bar"
$ [[ $str != *"something 1"* || $str != *"something 2"* ]] && echo true || echo false
true
$ str="foo something 1 bar"
$ [[ $str != *"something 1"* || $str != *"something 2"* ]] && echo true || echo false
true
$ str="foo something 2 bar"
$ [[ $str != *"something 1"* || $str != *"something 2"* ]] && echo true || echo false
true
$ str="foo something 1 something 2 bar"
$ [[ $str != *"something 1"* || $str != *"something 2"* ]] && echo true || echo false
false
如果$str
与任何模式都不匹配,我认为您想要的是真实的,这意味着您需要&&
而不是||
:
$ str="foo no pattern bar"
$ [[ $str != *"something 1"* && $str != *"something 2"* ]] && echo true || echo false
true
$ str="foo something 1 bar"
$ [[ $str != *"something 1"* && $str != *"something 2"* ]] && echo true || echo false
false
$ str="foo something 2 bar"
$ [[ $str != *"something 1"* && $str != *"something 2"* ]] && echo true || echo false
false
要理解为什么会这样,请检查De Morgan's laws,其中一个说“不(A或B)”与“(不是A)和(不是B)”相同。