1

我有个问题。如果我的if陈述是true,它会跳过elif检查并直接进入fi还是仍然检查elif陈述?

脚本示例:

if [ argument1 || argument2 ]  
     then  
          do something.  
elif [ argument2 || argument3 ]  
     then  
          do something.  
elif [ argument2 || argument4 ]  
     then  
          do somthing.  
else  
          do somthing else.  
fi  

我的问题是,如果我的第一个陈述是真的,我希望我的elif陈述仍然受到检查。如果我的第一个陈述是......等,if我还希望我的陈述得到检查。基本上我希望我的所有和陈述都被检查。 elifeliftrueifelif

注意。我意识到我可以更改我的所有eliftoif语句,这可能会解决我的问题,因为所有if语句都会被检查。但这个问题也是出于好奇和对ifandelif语句的更好了解。

如果您需要更多信息,请告诉我。

4

3 回答 3

4

elif如果先前的其中一个匹配,则不检查该语句。elif是“else if”的缩写;这意味着如果前一个不匹配,您应该检查其他条件。

正如您所说,您可以if为您的用例使用多个语句。

于 2012-10-01T15:50:36.847 回答
1

一旦满足一个条件,if语句就会终止,其余的elif条件将不会被检查。

例子:

if echo foo
then
   echo "in foo"
elif echo bar
then
   echo "in bar"
fi

印刷

foo
in foo

如果您希望它们全部检查,那么您需要按照您的建议将其分解为多个 if 语句。

于 2012-10-01T15:51:07.220 回答
0

虽然我知道这是一篇旧帖子,但对于 OP 最初询问的内容,最好使用 BASH >=4.0 的 case/esac 语句和;;&终止符。而且,由于BASH 4.0 于 2009 年 2 月 20 日发布,他们应该能够在该脚本中使用它。

像这样的东西:

    case $anyargument in
        [[ argument1 || argument2 ]] )
            do something
            ;;&
        [[ argument2 || argument3 ]] )
            do something
            ;;&
        [[ argument2 || argument4 ]] )
            do something
            ;;
        * ) 
            do something else.
            ;;
    esac

现在,我在最后一次实际测试中使用了常规;;终止符,因此它不会落入 catch-all (READ: else) 语句。但是按照编写的方式,将检查所有测试,如果它们解决true了,代码将被执行。

希望这会有用。

于 2021-12-18T00:48:31.780 回答