0

代码:

if [cond1]
   then if [cond2]
        then ...
        else skip to elif
   fi

elif[cond3]
   then ...
fi

如果第二个条件不匹配跳到 elif。

4

3 回答 3

1

请注意,在下面的代码中,elif quux...是一个占位符,用于表示elif您所拥有的任何 s after elif cond3

如果您不需要测试cond3跳过

(也就是说,你想在跳过的时候执行它的代码,即使cond3是假的。)

正如@code4me 所建议的,您可以使用一个函数:

foo() { 
  # do work
}

if cond1; then
  if cond2; then
    ...
  else
    foo
  fi
elif cond3; then
  foo
elif quux...

这也是@fedorqui 的建议起作用的地方:

if cond1 && cond2; then
  ...
elif cond3; then
  # do work
elif quux...

如果您确实需要测试cond3跳过

逻辑变得更难遵循。

foo() {
  # Note the condition is tested here now
  if cond3; then
    # do work
  fi
}

if cond1; then
  if cond2; then
    ...
  else
    foo
  fi
else
  # This code is carefully constructed to ensure that subsequent elifs
  # behave correctly
  if ! foo; then
    # Place the other elifs here
    if quux...
于 2013-07-19T13:02:49.487 回答
0

所以这是你的代码:

if [cond1]
then
    if [cond2]
    then
        doX
    else
        skip to elif
    fi
    doY
elif[cond3]
then
    doZ
fi

我添加了doXdoYdoZ作为在这些情况下将要运行的任何代码的占位符。所以,这意味着:

  • doX[cond1]为真且[cond2]为真时执行
  • doY[cond1]为真且[cond2]为真时执行
  • doZ在以下任一情况下执行:
    • [cond1]是真的,[cond2]是假的,[cond3]是真的
    • [cond1]是假的,[cond3]是真的

这意味着您的代码可以这样编写:

if [cond1] && [cond2]
then
    doX
    doY
elif [cond3]
    doZ
fi

编辑:看起来@fedorqui 实际上在评论中建议了这一点。

于 2013-07-19T13:19:04.140 回答
0

很难看出您希望您的代码在第一部分elif的中间执行它在做什么。ifelif部分是否需要成为功能?

否则,您可以重新编码您的if陈述以考虑condition2在内。

if [ condition1 -a ! condition2 ]
then
    ....
elif [ condition3 -o condition1 ]
    ....
fi

现在,仅当条件 1为真条件2不为真时,该if子句才会执行。无需检查else 子句中的condition2 。

在您的子句中,如果条件3为真条件1 为真elif您将执行。默认情况下,仅当条件2 也为真时才会在条件 1为真时执行。否则,您将执行该子句。 if

顺便说一句,有些答案几乎与我给出的相符。但是,他们需要将该or子句添加到该elif条件。如果条件1为真,条件2为真,但条件3为假怎么办?你想执行那个elif子句。对?

于 2013-07-19T13:36:38.393 回答