【问题标题】:Consolidate multiple if statements in Ksh在 Ksh 中合并多个 if 语句
【发布时间】:2012-02-02 08:24:12
【问题描述】:

如何将以下 if 语句合并到一行中?

if [ $# -eq 4 ]
then
        if [ "$4" = "PREV" ]
        then
                print "yes"
        fi
fi
if [ $# -eq 3 ]
then
        if [ "$3" = "PREV" ]
        then
                print "yes"
        fi
fi

我正在使用 ksh。

为什么会报错?

if [ [ $# -eq 4 ] && [ "$4" = "PREV" ] ]
        then
                print "yes"
        fi

错误:

0403-012 测试命令参数无效。

【问题讨论】:

    标签: shell ksh sh


    【解决方案1】:

    试试这个:

    if [[ $# -eq 4 && "$4" == "PREV" ]]
    then
        print "yes"
    fi
    

    您也可以尝试像这样将它们放在一起:

    if [[ $# -eq 4 && "$4" == "PREV"  || $# -eq 3 && "$3" == "PREV" ]]
    then
        print "yes"
    fi
    

    您是否只想检查最后一个参数是否为“PREV”?如果是这样,你也可以这样做:

    for last; do true; done
    if [ "$last" == "PREV" ]
    then
        print "yes"
    fi
    

    【讨论】:

      【解决方案2】:

      试试这个:

      if  [ $# -eq 4 ]  && [ "$4" = "PREV" ]
          then
                  print "yes"
          fi
      

      【讨论】:

        【解决方案3】:

        '[' 不是 sh 中的分组标记。你可以这样做:

        如果 [ expr ] && [ expr ];然后 ...

        如果 cmd && cmd;然后 ...

        如果 { cmd && cmd; };然后 ...

        您也可以使用括号,但语义略有不同,因为测试将在子 shell 中运行。

        if ( cmd && cmd; );然后 ...

        另外,请注意“if cmd1; then cmd2; fi”与“cmd1 && cmd2”完全相同,所以你可以这样写:

        测试 $# = 4 && 测试 $4 = PREV && echo 是

        但如果您的意图是检查最后一个参数是否为字符串 PREV,您可以考虑:

        评估测试 \$$# = PREV && echo 是

        【讨论】:

        • 注意第一个例子只是第二个的特例,命令是'['
        猜你喜欢
        • 2020-01-28
        • 2014-02-02
        • 2013-08-30
        • 1970-01-01
        • 1970-01-01
        • 2018-10-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多