在Ksh中合并多个if语句

时间:2012-01-04 12:21:21

标签: shell ksh sh

如何将以下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测试命令参数无效。

3 个答案:

答案 0 :(得分:2)

试试这个:

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

答案 1 :(得分:1)

试试这个:

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

答案 2 :(得分:1)

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

if [ expr ] && [ expr ]; then ...

if cmd && cmd; then ...

if { cmd && cmd; }; then ...

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

if ( cmd && cmd; ); then ...

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

test $# = 4 && test $4 = PREV && echo yes

但如果您打算检查最后一个参数是字符串PREV,您可以考虑:

eval test \$$# = PREV && echo yes