Застрял с "здесь документ "EOF" не закрыт"

Я пытаюсь написать сценарий bash, но я все еще получаю эту ошибку:

here document `cmd' unclosed

Я не знаю, что не так; пожалуйста, вы можете помочь?

#!/bin/bash
USER='login'
PASS='password'

echo $USER
echo $PASS

cd /tmp
for plik in *.tar.gz
do
    echo $plik  
    ftp -niv 192.168.12.2 << cmd
    user $USER $PASS
    cd /centrala/nagrania
    put $plik
    bye 
    cmd
done

Я перебираю все *.tar.gz для отправки нескольких файлов на ftp-сервер, и эта ошибка останавливает меня.


person przeqpiciel    schedule 14.05.2014    source источник


Ответы (2)


Это должно работать:

ftp -niv 192.168.12.2 <<-cmd
    user $USER $PASS
    cd /centrala/nagrania
    put $plik
    bye 
cmd

Согласно руководству:

Если оператор перенаправления ‹‹-, то все начальные символы табуляции удаляются из входных строк и строки, содержащей разделитель. Это позволяет размещать здесь-документы в сценариях оболочки естественным образом.

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

person anubhava    schedule 14.05.2014
comment
правильно :) я удалил все вкладки и теперь работает :) - person przeqpiciel; 14.05.2014
comment
Рад узнать, что это сработало для вас. - person anubhava; 15.05.2014

  • По умолчанию разделитель here-doc, закрывающий, должен начинаться с самого начала строки, иначе он выиграл. не быть признанным.

  • В качестве альтернативы, если вы добавите префикс открывающий разделитель к -, то закрывающий разделитель может иметь начальные вкладки. - но только настоящие \t символы, а не пробелы. Обратите внимание, что это также удаляет начальные табуляции из строк самого документа.

К сожалению, bash не предлагает возможности обрезать начальные пробелы (также), учитывая, что многие редакторы имеют возможность вставлять несколько пробелов вместо настоящих символов табуляции (\t), когда пользователь нажимает клавишу TAB.

Поскольку разница между несколькими пробелами и подлинными вкладками:

  • обычно неочевиден (обычно вы не можете сказать, глядя на него, как в вопросе),
  • копирование и вставка могут даже незаметно преобразовывать из табуляции в пробелы

более надежное решение состоит в том, чтобы НЕ полагаться на использование префикса - — к сожалению, за счет удобочитаемости (в зависимости от того, как используется строка, начальные пробелы в самом документе - в отличие от закрывающего разделителя - все же может быть приемлемым):

# ...      
for plik in *.tar.gz
do
    echo $plik  

    cat << cmd
user $USER $PASS
cd /centrala/nagrania
put $plik
bye 
cmd

done
person mklement0    schedule 14.05.2014