Ошибка строки в сценарии командной строки
-
21-08-2019 - |
Вопрос
У меня есть следующий код в сценарии оболочки.Кажется, что это работает только тогда, когда это так нет определяется в функции.Проблемная строка - это строка, содержащая "<<".Сообщение об ошибке выглядит следующим образом
"./бежать:строка 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
метка должна быть единственной в строке без начальных / завершающих пробелов.