Поиск по сайту:

Как выполнить проверку синтаксиса в режиме отладки в сценариях оболочки


Мы начали серию статей об отладке сценариев оболочки с объяснения различных параметров отладки и способов включения режимов отладки сценариев оболочки.

После написания сценариев оболочки рекомендуется практически проверить синтаксис сценариев перед их запуском, а не просматривать их выходные данные, чтобы убедиться, что они работают правильно.

В этой части серии мы рассмотрим, как использовать режим отладки проверки синтаксиса. Помните, что в первой части этой серии мы объясняли различные параметры отладки, а здесь мы будем использовать их для отладки скриптов.

Включение режима подробной отладки

Прежде чем мы перейдем к основной теме этого руководства, давайте кратко рассмотрим подробный режим. Он включается опцией отладки -v, которая указывает оболочке отображать все строки сценария во время их чтения.

Чтобы продемонстрировать, как это работает, ниже приведен пример сценария оболочки для пакетного преобразования изображений PNG в формат JPG.

Введите (или скопируйте и вставьте) его в файл.

#!/bin/bash
#convert
for image in *.png; do
        convert  "$image"  "${image%.png}.jpg"
        echo "image $image converted to ${image%.png}.jpg"
done
exit 0

Затем сохраните файл и сделайте скрипт исполняемым, используя команду ниже:

chmod +x script.sh

Мы можем вызвать скрипт и отобразить все его строки по мере их чтения оболочкой следующим образом:

bash -v script.sh

Включение режима отладки проверки синтаксиса в сценариях оболочки

Возвращаясь к нашей основной теме: -n активирует режим проверки синтаксиса. Он инструктирует оболочку читать все команды, но не выполняет их, а только проверяет используемый синтаксис.

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

Синтаксис активации проверки синтаксиса следующий:

bash -n script.sh

Поскольку синтаксис сценария правильный, приведенная выше команда не выведет никаких результатов. Поэтому давайте попробуем удалить слово done, закрывающее цикл for, и посмотрим, показывает ли оно ошибку:

Ниже приведен модифицированный сценарий оболочки для пакетного преобразования изображений PNG в формат jpg, который содержит ошибку.

#!/bin/bash
#script with a bug
#convert
for image in *.png; do
        convert  "$image"  "${image%.png}.jpg"
        echo "image $image converted to ${image%.png}.jpg"

exit 0

Сохраните файл, затем запустите его, выполняя в нем проверку синтаксиса:

bash -n script.sh

Из приведенного выше вывода мы видим, что в нашем скрипте существует синтаксическая проблема: в цикле for отсутствует закрывающее ключевое слово done. И оболочка искала его до конца файла, а когда не нашла (готово), оболочка вывела синтаксическую ошибку:

script.sh: line 11: syntax error: unexpected end of file

Мы также можем объединить подробный режим и режим проверки синтаксиса:

bash -vn script.sh

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

#!/bin/bash -n
#altering the first line of a script to enable syntax checking

#convert
for image in *.png; do
    convert  "$image"  "${image%.png}.jpg"
    echo "image $image converted to ${image%.png}.jpg"

exit 0

Как и прежде, сохраните файл и запустите его, выполняя проверку синтаксиса:

./script.sh

script.sh: line 12: syntax error: unexpected end of file

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

В приведенном ниже примере мы проверяем только синтаксис цикла for в нашем скрипте.

#!/bin/bash
#using set shell built-in command to enable debugging
#convert

#enable debugging
set -n
for image in *.png; do
    convert  "$image"  "${image%.png}.jpg"
    echo "image $image converted to ${image%.png}.jpg"

#disable debugging
set +n
exit 0

Еще раз сохраните файл и вызовите скрипт:

./script.sh 

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

Чтобы отправить нам любые вопросы или отзывы относительно этого руководства, используйте форму ответа ниже. В третьей части этой серии мы перейдем к объяснению и использованию режима отладки трассировки оболочки.