通过Logical&&和||

时间:2014-02-20 16:17:44

标签: shell if-statement ksh conditional-statements logical-operators

我正在尝试建立使用Logical&&的等价性。和||操作员到'If then else fi'条件,我想验证这种理解是否正确。 考虑这个条件,与我的相关

if ( flag="$value" ) then 
function1 ( p1) 
rc=$?
    if ( "$rc"=0 ) then 
    function2 ( p2)
    fi
elif (flag="$value2" ) then
function1 ( p1) 
rc=$?
    if ( "$rc"=0 ) then 
    function2 ( p2)
    fi
else 
echo "Msg"
fi

以逻辑&&和和||如

 ( ( [ flag = "$value" ] && function1 (p1) ) && function2 (p2) ) || 
   ( ( [ flag = "$value2" ] && function1 (p2) ) && function2 (p2)) || 
    echo "message" 

我的Q是:

  • 是否可以始终使用上述方法。
  • 有什么需要注意的注意事项和注意事项
  • 在其他地方有一些关于()括号旋转的新shell,其变量不可用于父级。我想看看如何将这些运算符分组以指示优先级,如果它不是那些()括号。

@Chepner。谢谢澄清。 所以在一个看起来像这样的案例陈述中

optf=false
opte=false
optp=false

case $opt in

  p ) ...
     (( $opte || $optf ) && [ -n "$s1" ] ) && echo "error message" 

以上内容可以改写为

 {{ $opte || $optf } ; && [ -n "$s1" ] ; } && echo "error message" 

因此它会转换这个逻辑:当你遇到p选项时,检查opte或optf是否为真。如果其中任何一个为真并且s1有值,则抛出错误消息。 会是这种情况,还是还有一些漏洞要堵塞。 知道 - 我没有注意到“;” 。随{}; - 我应该能够以我想要的方式与我的操作员联系吗?

1 个答案:

答案 0 :(得分:4)

请注意

if command1; then
    command2
else
    command3
fi

不等同于command1 && command2 || command3

  • 如果command1失败,则会跳过command2并按预期运行command3
  • 如果command1成功,command2运行并成功,则会跳过command3,如预期的那样。
  • 如果command1成功,而command2运行且失败,则会运行command3,这与if声明不同。

你需要使用类似的东西:

command1 && { command2; true; } || command3

这将迫使&&的右手操作数成功,无论command2是否成功,以便command3command1成功时永远不会运行。< / p>