Ошибка строки в сценарии оболочки - PullRequest
0 голосов
/ 11 мая 2009

У меня есть следующий код в сценарии оболочки. Кажется, это работает только тогда, когда не определено в функции. Проблемная строка - та, которая содержит «<<». Сообщение об ошибке </p>

"./ run: строка 210: синтаксическая ошибка: неожиданный конец файла "

Как я могу написать это правильно в функции?

init_database()
{
    cd ../cfg
    db.sh << ENDC
    $DB_ADMIN

    0
    y
    n
    ENDC

    check_status

    sqlplus $DB_SCHEMA@$DB_NAME < initial_data.sql

    cd -
}

Ответы [ 3 ]

5 голосов
/ 11 мая 2009

Существует несколько способов решения этой проблемы.

1 / Отменить отступ маркера конца документа, например:

cat <<EOF
    hello
    $PWD
EOF

но это сделает ваш код уродливым.

2 / "Отступ" здесь маркер начала документа:

cat <<' EOF'
    hello
    $PWD
    EOF

где этот бит перед первым EOF точно такой же, как и перед вторым (табуляция, четыре пробела, две табуляции, что угодно). Это позволяет сохранить приятный отступ, хотя он не расширяет переменные внутри документа here ($PWD не изменяется).

3 / Разрешить удаление вкладок с начала строк ввода и маркера конца.

cat <<-EOF
    hello
    $PWD
    EOF

но нет способа получить вкладки в начале строк.

4 / Для ваших целей вы также можете использовать:

(   echo "$DB_ADMIN";
    echo "" ;
    echo "0" ;
    echo "y" ;
    echo "n"
) | db.sh
check_status
sqlplus $DB_SCHEMA@$DB_NAME < initial_data.sql
cd -

Я считаю, что номер 4 - лучший вариант для вас. Это позволяет красиво выстраивать ввод, табуляции и пробелы в любом месте строк и расширять переменные.

1 голос
/ 11 мая 2009

Метка ENDC должна быть одна в строке без пробелов в начале / конце.

1 голос
/ 11 мая 2009

Я боюсь, что конец вашего "Здесь документа" должен быть с отступом.

...