2009-05-11 2 views
0

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

"./run: line 210: syntax error: unexpected end of file"

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

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

    0 
    y 
    n 
    ENDC 

    check_status 

    sqlplus [email protected]$DB_NAME < initial_data.sql 

    cd - 
} 

ответ

5

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

1/Unindent здесь-документ маркер конца, такие как:

cat <<EOF 
    hello 
    $PWD 
EOF 

, но это сделает ваш код выглядеть некрасиво.

2/«Отступ» здесь-документ начать маркер:

cat <<' EOF' 
    hello 
    $PWD 
    EOF 

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

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

cat <<-EOF 
    hello 
    $PWD 
    EOF 

, но нет возможности получить вкладки в начало строк.

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

( echo "$DB_ADMIN"; 
    echo "" ; 
    echo "0" ; 
    echo "y" ; 
    echo "n" 
) | db.sh 
check_status 
sqlplus [email protected]$DB_NAME < initial_data.sql 
cd - 

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

1

Конец вашего документа «Здесь» должен быть неспособен, я боюсь.

+0

Вы также можете использовать '<< -' как ваш оператор heredoc (вместо '<<'), который позволит вести вкладки в вашей предельной строке (но не в ведущих пробелах). – Plutor

1

Маркировка ENDC должна быть отдельной в строке без ведущих/задних белых пространств.

Смежные вопросы