LINUX.ORG.RU

Помогите найти ошибку в скрипте

 ,


1

1

Не так давно начал изучать сценарии командной оболочки, делал всё по листингу, но всё ровно нарвался на ошибку( На этом примере многое завязано в книге, просто проскипать будет не правильно, помоги плз найти ошибку. Файл кодом надо перенаправить на такойже но с ".html", вот так это выглядит: «file > file.html» и на этом этапе падает ошибка.

Текст листинга:

#!/bin/bash

#Программа выводит страницы с информацией о системе

TITLE="System Informatin Report for $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIME_STAMP="Generated $CURRENT_TIME, by $USER"

report_uptime () {
    cat <<-_EOF_
	    <H1>System Uptimes<H1>
	    <PRE>$(uptime)</PRE>
	    _EOF_
    return
}

report_disk_space () {
      cat <<-_EOF_
	    <H1>Disk Space Utilization<H1>
	    <PRE>$(df -h)</PRE>
	    _EOF_
    return
}

report_home_space () {
     cat <<-_EOF_
	    <H1>Home Space Utilization<H1>
	    <PRE>$(du -sh /home/*)</PRE>
	    _EOF_
    return
}

cat << _EOF_
<HTML>
	<HEAD>
		<TITLE>$TITLE</TITLE>
	</HEAD>
	<BODY>
		<H1>$TITLE</H1>
		<P>$TIME_STAMP</P>
		$(report_uptime)
		$(report_disk_space)
		$(report_home_space)
	</BODY>
</HTML>
_EOF_
# здесь ошибка если верить консоли 

текст ошибки такой: «Строка 47 ошибка синтаксиса: неожиданный конец файла»

А почему ты не пробуешь запускать команды по одной в консоли? Сразу стало бы всё понятно.

Подозреваю что в функциях пробелы перед EOF.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)

Перед всеми завершающими _EOF_ не должно быть пробелов.

report_uptime () {
    cat <<-_EOF_
	    <H1>System Uptimes<H1>
	    <PRE>$(uptime)</PRE>
_EOF_
    return
}

и т.д.

d_a ★★★★★
()
#!/bin/bash

#Программа выводит страницы с информацией о системе

TITLE="System Informatin Report for $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIME_STAMP="Generated $CURRENT_TIME, by $USER"

report_uptime () {
    cat <<-_EOF_
        <H1>System Uptimes<H1>
        <PRE>$(uptime)</PRE>
_EOF_
    return
}

report_disk_space () {
      cat <<-_EOF_
	    <H1>Disk Space Utilization<H1>
	    <PRE>$(df -h)</PRE>
_EOF_
    return
}

report_home_space () {
     cat <<-_EOF_
	    <H1>Home Space Utilization<H1>
	    <PRE>$(du -sh /home/*)</PRE>
_EOF_
    return
}

cat <<-_EOF_
<HTML>
	<HEAD>
		<TITLE>$TITLE</TITLE>
	</HEAD>
	<BODY>
		<H1>$TITLE</H1>
		<P>$TIME_STAMP</P>
		$(report_uptime)
		$(report_disk_space)
		$(report_home_space)
	</BODY>
</HTML>
_EOF_
romanlinux ★★★
()
Ответ на: комментарий от Kroz

И это верное подозрение))) Всем спасибо, помогло!

sergei111
() автор топика
Ответ на: комментарий от d_a

Перед всеми завершающими _EOF_ не должно быть пробелов.

Это не совсем верно. Точнее пробелов там быть не должно, могут быть только <TAB>-ы:

man bash

          <<[-]word
                  here-document
          delimiter

   If the redirection operator is <<-, then all leading tab characters are stripped from input lines and the line con‐
   taining delimiter.  This allows here-documents within shell scripts to be indented in a natural fashion.

Ключевые фразы - «all leading tab characters» и «and the line containing delimiter».

Т.к. разные редакторы могут вести себя по-разному (заменять tab на пробелы), лично я не использую конструкцию «<<-» в скриптах. Да, они от этого могут стать менее читабельные, но зато это позволяет избежать ошибок.

spirit ★★★★★
()
Ответ на: комментарий от spirit

разные редакторы могут вести себя по-разному

Совершенно очевидно, что разные текстовые редакторы не нужны. А нужен тот, где нажимаешь ^V и вставляешь следующий символ как есть.

d_a ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.