Bash if - >然后如果 - >否则跳到第一个elif

时间:2013-07-19 12:20:40

标签: bash shell

代码:

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

elif[cond3]
   then ...
fi

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

3 个答案:

答案 0 :(得分:1)

请注意,在下面的代码中,elif quux...elif之后elif cond3的占位符。

如果您不需要在跳过时测试cond3

(也就是说,即使cond3为false,您也希望在跳过时执行其代码。)

正如@ 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...

答案 1 :(得分: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]为false且[cond3]为真
    • [cond1]为false且[cond3]为真

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

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

编辑:看起来@fedorqui在评论中提到了这一点。

答案 2 :(得分:0)

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

否则,您可以重新编码if语句以考虑condition2

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

现在,if子句只有在 condition1 都为真并且 condition2 不为真时才会执行。无需检查else子句中的 condition2

elif子句中,如果 condition3 为真 condition1 ,您将执行是真的。默认情况下,仅当 condition1 为true且 condition2 也为真时,才会执行此操作。否则,您将执行if子句。

顺便说一下,一些答案 几乎 与我给出的相符。但是,他们需要将or子句添加到elif条件。如果 condition1 为真, condition2 为真,但 condition3 为假,该怎么办?您想执行该elif子句。正确?