【问题标题】:Expressing If then else via Logical && and ||通过逻辑 && 和 || 表达 If then else
【发布时间】:2014-03-21 17:35:24
【问题描述】:

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

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" 

我的问题是:

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

@切普纳。谢谢你的澄清。 所以在一个看起来像这样的case语句中

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 有一个值,则抛出错误消息。 是这样吗,还是还有一些孔要塞。 Gotcha-我没有注意到“;” .和 { } ; - 我应该可以随心所欲地加入我的运营商?

【问题讨论】:

  • 请从有效的shell开始。你的if...else 声明不是。
  • 您好,谢谢。它的 KSH
  • () 必须放在整个命令周围。当它们作为命令参数出现时,它们通常会导致语法错误。

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


【解决方案1】:

注意

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 成功时永远不会运行。

【讨论】:

  • 谢谢。您还可以添加一个注释,说明 () 括号用于指导运算符优先级的效果,而不是它们在生成变量不可用的新 shell 中的效果。
  • 您可以使用{...} 获得相同的效果,而无需生成子shell。对() 内部变量的任何更改都不会保留在子shell 之外,而{} 内部的更改则保留。
  • 我更新了问题并进行了澄清。只需检查以上是否正确。谢谢'增益
猜你喜欢
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
相关资源
最近更新 更多