Консолидация нескольких операторов if в Ksh - PullRequest
1 голос
/ 04 января 2012

Как мне объединить следующие операторы в одну строку?

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 ]

3 голосов
/ 04 января 2012

Попробуйте это:

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 голос
/ 04 января 2012

'[' не является токеном группировки в sh. Вы можете сделать:

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

или

if cmd && cmd; then ...

или

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

Вы также можете использовать скобки, но семантика немного отличается, так как тесты будут выполняться в подоболочке.

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

Также обратите внимание, что «if cmd1; затем cmd2; fi» в точности совпадает с «cmd1 && cmd2», поэтому вы можете написать:

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

но если вы хотите проверить, что последним аргументом является строка PREV, вы можете подумать:

eval test \$$# = PREV && echo yes
1 голос
/ 04 января 2012

Попробуйте это:

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