Вопрос

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

"./бежать:строка 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 -
}
Это было полезно?

Решение

Существует несколько способов устранить эту проблему.

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

cat <<EOF
    hello
    $PWD
EOF

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

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

cat <<' EOF'
    hello
    $PWD
    EOF

где этот бит перед первым EOF точно такой же, как и перед вторым (табуляция, четыре пробела, две табуляции, что угодно).Это позволяет вам сохранить хороший отступ, хотя и не расширяет переменные внутри here-document ($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 - лучший вариант для вас.Это позволяет аккуратно выровнять вводимые данные, табуляции и пробелы в любом месте строк и изменять расширение.

Другие советы

Боюсь, конец вашего "Here document" должен быть без отступов.

Тот Самый ENDC метка должна быть единственной в строке без начальных / завершающих пробелов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top