ошибка синтаксиса bash при использовании оператора case - PullRequest
0 голосов
/ 29 сентября 2010

У меня есть скрипт bash, который я регулярно использую в своей работе для автоматизации большой работы. Я вносил некоторые изменения сегодня, но все казалось хорошо. Сам скрипт имеет длину около 1700 строк. Первая часть скрипта все хорошо и проходит через весь пользовательский ввод и логику просто отлично. Затем он переходит в ядро ​​сценария и перестает работать точно в строке 875 (протестировал сценарий с помощью bash -x, чтобы найти точку останова). Тем не менее, он ломается со следующей ошибкой:

script.sh: line 1341: syntax error near unexpected token `;;'
script.sh: line 1341: `                    ;;'

Строка 1341 находится в середине оператора case. Следующий код является началом этого блока кода, где он ломается:

if [[ $VAR1 = "TRUE"  && $VAR2 = "VAL2" ]]; then
VERSION=`XXXXXXXXXXXXXXXX`
## Set variables based on location $VAR3
case $VAR3 in
    STR1 )
        case $VERSION in
            STR2 )
                VAR4 = "STR5"
                VAR5 = "STR6"
                VAR6 = "STR7"
                VAR7 = "STR8"
Line 1341 --->  ;;
            STR3 )
                VAR4="STR9"
                VAR5="STR10"
                VAR6="STR11"
                VAR7="STR12"
                ;;
            STR4 )
                VAR4="STR13"
                VAR5="STR14"
                VAR6="STR15"
                VAR7="STR16"
                ;;
        esac
        VAR8="STR17"
        VAR9="STR18"
        VAR10=1
        VAR11="STR19"
        ;;

Из-за деликатного характера того, что я делаю, мне, очевидно, пришлось удалить довольно много информации. Я знаю, что это может усложнить мне задачу. Однако все VAR ## = "STR ##" являются стандартными объявлениями переменных со строковыми значениями, ничего особенного (без подстановки переменных и т. Д.). Все переменные используются позже в скрипте. Код для VERSION возвращает строковое значение, которое используется во вложенном case.

Скрипт работал нормально до сегодняшних изменений, но я действительно не затрагивал этот раздел, за исключением настройки некоторых значений STR. Я попытался установить переменные $VAR3 и $VERSION в кавычках "", а также значения STR, используемые в качестве случаев. Я попытался вынуть этот блок полностью, только чтобы он потерпел неудачу в следующем блоке (STR1 имеет другое значение, поэтому измените объявления переменных). У меня есть вывод на консоль, что он делает, а также проверяет наличие ошибок после большинства функций. На консоли нет ничего необычного и ничего в журнале ошибок.

Буду признателен за любую помощь, и я знаю, что прошу много.

Кстати, вот код в строке 875, где скрипт перестает работать (здесь нет ошибок, сгенерированных на основе кода). Опять же, с помощью bash -x я мог видеть, как устанавливается переменная VAR2, но сценарий прерывается до запуска следующего цикла for.

## Create file ##
echo 'Creating files . . . '
j=0
p=1111
if [ $VAR1 = "TRUE" ]
    then 
        VAR2=1
else 
    VAR2=2
fi
for i in `seq 1 $HOWMANY`; do    <----Line 875
echo -n "Creating file . . . "
echo "XXXXXXXXXXX

Еще раз спасибо.

Ответы [ 2 ]

3 голосов
/ 29 сентября 2010

Проблема, вероятно, где-то между строкой 875 (или чуть раньше) и строкой 1341. Это может быть неуместная цитата или что-то менее тонкое. Нам будет практически невозможно отладить без всего исходного материала между этими строками.

Предложение 1: запустите команду 'bash -n -v' и посмотрите, поможет ли это вам понять проблему.

Предложение 2: разбить скрипт на более мелкие части, которыми легче управлять - и которые можно отдельно отлаживать. Самые большие скрипты, которые у меня есть (из 400 в моем каталоге bin), взяты из пакета autoconf - они весят чуть менее 1100 строк; следующий по величине мой, и сценарий на 750 строк слишком большой d..n . Следующие по величине скрипты - это от 600 до 700 строк Perl (включая документацию Perl).


Сказав 'пропущенную цитату', я вижу, что ваш фрагмент рядом со строкой 875 имеет:

echo -n "Creating file . . . "
echo "XXXXXXXXXXX

с отсутствующей двойной кавычкой из второго эха.


Вы также упомянули о внесении изменений, хотя и не близко к точке, где сценарий ломается. Поскольку у вас есть код под управлением версией (вы не мечтали бы поиграть со сценарием в 1700 строк без резервных копий, не так ли?), Вам следует снова посмотреть на реальные изменения.

Или даже вернитесь к предыдущей рабочей версии и внесите изменения снова, по одному, осторожно, пока не поймете, почему вы что-то сломали.

2 голосов
/ 29 сентября 2010

В этом разделе у вас есть пробелы вокруг знаков равенства:

case $VERSION in
            STR2 )
                VAR4 = "STR5"
                VAR5 = "STR6"
                VAR6 = "STR7"
                VAR7 = "STR8"

Удалите их, и вы можете быть в порядке (если это не ошибка публикации).

...