«Большой» еще, если дерево в баш - PullRequest
1 голос
/ 07 марта 2012
if [ "$1" == "on" ]; then

        echo "Maintenance going on"
        echo "<maintenance/>" > $MFILE

else if [ "$1" == "off" ]; then

        echo "Maintenance going off"
        rm $MFILE

else if [ "$1" == "status" ]; then

        if [ -f $MFILE ]; then
                echo "Maintenance is ON"
        else
                echo "Maintenance is OFF"
        fi

else

        echo "ERROR: Unknown command $1"
        exit 1

fi

Если я пытаюсь запустить этот скрипт, я получаю ошибку «неожиданный конец файла».Я подозреваю, что это потому, что что-то не так в if / else / else if, но я нахожу это на удивление трудным для Google примером того, каким должен быть синтаксис.Кто-нибудь здесь знает?

Ответы [ 4 ]

6 голосов
/ 07 марта 2012

Немного не по теме, но не будет ли более читабельным следующее:

case $1 in
on)
        echo "Maintenance going on"
        echo "<maintenance/>" > $MFILE
        ;;

off)

        echo "Maintenance going off"
        rm $MFILE
        ;;

status)

        if [ -f $MFILE ]; then
                echo "Maintenance is ON"
        else
                echo "Maintenance is OFF"
        fi
        ;;

*)    
        echo "ERROR: Unknown command $1"
        exit 1
        ;;

esac
6 голосов
/ 07 марта 2012

вы должны использовать «elif», а не «else if»

текст от http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_02.html

Это полная форма оператора if:

если ТЕСТ-КОМАНДЫ; то

CONSEQUENT-КОМАНДА;

elif MORE-TEST-COMMANDS; то

MORE-CONSEQUENT-КОМАНДА;

else ALTERNATE-CONSEQUENT-COMMANDS;

ц

Список TEST-COMMANDS выполняется, и если его статус возврата равен нулю, список CONSEQUENT-COMMANDS выполняется. Если TEST-COMMANDS возвращает ненулевой статус, каждый список elif выполняется по очереди, и если его выход состояние равно нулю, соответствующие MORE-CONSEQUENT-COMMANDS выполнены и команда завершается. Если еще следует Список ALTERNATE-CONSEQUENT-COMMANDS и последняя команда в финальной если предложение или elif имеет ненулевой статус выхода, то ALTERNATE-CONSEQUENT-COMMANDS выполняется. Статус возврата статус выхода последней выполненной команды или ноль, если нет условий проверено верно.

3 голосов
/ 07 марта 2012

Опция elif уже была опубликована Кентом , а отличная альтернатива была отправлена ​​beny23 , надеюсь, это может дать некоторую информацию. Причина, по которой вы получаете ошибку unexpected end of file, заключается в том, что if не были закрыты должным образом. (Я не уверен, что это то, что Каз пытается сказать в ответе, поэтому я добавляю этот ответ) Bash видит ваш сценарий
if ..
else
.. if
.. else
.. .. if
Таким образом, 2 пропавших без вести fi.

if [ "$1" == "on" ]; then #if 1

        echo "Maintenance going on"
        echo "<maintenance/>" > $MFILE

else 
    if [ "$1" == "off" ]; then #if 2

        echo "Maintenance going off"
        rm $MFILE

    else 
        if [ "$1" == "status" ]; then #if 3

            if [ -f $MFILE ]; then #if 4
                echo "Maintenance is ON"
            else
                echo "Maintenance is OFF"
            fi #for if 4                                                                                                                                      
        else
            echo "ERROR: Unknown command $1"
            exit 1

        fi #for if 3
    fi #for if 2
fi #for if 1

Надеюсь, это поможет!

1 голос
/ 07 марта 2012

Реальные источники информации, а не полагаться на случайные веб-учебники.

GNU bash info manual:

$ info bash

Справочная страница:

$ man bash

Спецификация единого Unix [грамматика оболочки]: http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_10

[... scrolling down ...]
/* The following are the reserved words. */

%token  If    Then    Else    Elif    Fi    Do    Done
/*      'if'  'then'  'else'  'elif'  'fi'  'do'  'done'   */

[...]
if_clause        : If compound_list Then compound_list else_part Fi
                 | If compound_list Then compound_list           Fi
                 ;
else_part        : Elif compound_list Then else_part
                 | Else compound_list
                 ;
...