неожиданный порядок выполнения кода в функциях запуска и остановки сценария оболочки - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть скрипт ниже,

#!/bin/bash
#test1.sh

echo "test ... "
for i in 1 2 3 4 5 
do
   #echo "Welcome $i times"
done
exit 0

и вывод

test ... 
./test11.sh: line 7: syntax error near unexpected token `done'
./test11.sh: line 7: `done'

Обратите внимание, что сначала он печатает, test..., затем жалуется на синтаксическую ошибку.

Однако в приведенном ниже сценарии

#test2.sh
 #!/bin/bash 


    case "$1" in
        'start')
                echo "in start 1"
                echo "in start 2"
                echo "in start 3"
                echo "test ... "
                for i in 1 2 3 4 5 
                do
                  #echo "Welcome $i times"
                done
                ;;
        'stop')
                echo "in stop"
                ;;
        'restart')
                stop ; echo "Sleeping..."; sleep 1 ; 
                echo "in restart"
                ;;
        'status')
                echo "in status"
                ;;
        *)  
                echo
                echo "Usage: $0 { start | stop | restart | status }"
                echo
                exit 1
                ;;
    esac

    exit 0

Вывод

./test10.sh: line 18: syntax error near unexpected token `done'
./test10.sh: line 18: `            done'

Сценарий жалуется на синтаксическую ошибку на line:18.Поскольку это язык сценариев, он должен выполняться построчно.В приведенном выше коде выполнение должно сначала перейти к start, а затем продолжить построчное выполнение.Поэтому я ожидаю, что выходные сообщения должны быть напечатаны сначала [echo "in start 1" etc], а затем синтаксическая ошибка.

Почему два вышеупомянутых сценария оболочки ведут себя по-разному?Сценарии оболочки анализируются на наличие ошибок перед началом выполнения?

1 Ответ

0 голосов
/ 20 сентября 2018

Цикл for во втором примере встроен в оператор case, а не является оператором верхнего уровня.Весь оператор case должен быть проанализирован, чтобы выполнить его, а это означает анализ цикла for в предложении start, даже если $1 (при расширении) не приводит к start

Синтаксическая ошибка по определению является результатом чего-то, что не может быть проанализировано , а не чем-то, что не может быть оценено .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...