使用&&和Bash整数和字符串条件和||在if语句中

时间:2016-08-02 00:35:32

标签: string bash integer conditional

在Bash脚本中,我有以下条件:

if [ $cnt -eq 1 ] && [[ $str != *"something 1"* || $str != *"something 2"* ]]

它没有按预期工作。这在巴什有可能吗?如果是这样,那么正确的语法是什么?如果$cnt -eq 1为真且$str != *"something 1"*$str != *"something 2"*为真,则if语句返回true。

1 个答案:

答案 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)”相同。