我的脚本出现意外的文件错误

时间:2014-08-25 21:35:02

标签: linux scripting

我正在为一些Linux脚本编写的代码遇到一些问题。 这是代码:

report_home_space ()
{
if [[ $(id -u) -eq 0 ]]; then
        cat << _eof_
                 <H2>Home Space Utilization (All Users)</H2>
                 <PRE>$(du -sh /home/*)</PRE>
               _eof_
else
        cat << _eof_
                 <H2>Home Space Utilization ($USER)</H2>
                 <PRE>$(du -sh $HOME)</PRE>
               _eof_
fi
return
}

脚本中还有其他功能,但它们都能正常工作。该脚本在这段代码中的某处将文件令牌的末尾拉错,但我找不到它。我有if语句的fi语句,我的文件标记的结尾都匹配。

非常感谢任何帮助。

在完成提供的一些答案后,我能够摆脱最初的意外eof错误,但同样的错误再次发生,但在我的脚本中的不同位置。 (确切地说是第58行,脚本的最后一行)。我将提供整个脚本,以便进行检查。

#!/bin/bash


#Program is used to output sys info as a web page

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

report_uptime () 
{
cat <<- _eof_
           <H2>System uptime</H2>
           <PRE>$(uptime)</PRE>
       _eof_
return
}

report_disk_space ()
{
cat <<- _eof_
           <H2>Disk space utilization</H2>
           <PRE>$(df -h)</PRE>
       _eof_
return
}

report_home_space () {
 if [[ $(id -u) -eq 0 ]]; then
                cat <<- _eof_
                           <H2>Home Space Ultilization (All Users)</H2>
                           <PRE>$(du -sh /home/*)</PRE>
                           _eof_
        else
                cat <<- _eof_
                           <H2>Home Space Ultilization ($USER)</H2>
                           <PRE>$(du -sh $HOME)</PRE>
                           _eof_
        fi
        return
}


cat <<- _eof_
      <HTML>
           <HEAD>
                     <TITLE>$TITLE</TITLE>
           </HEAD>
           <BODY>
                       <H1>$TITLE</H1>
                       <P1>$TIME_STAMP</P1>
                       $(report_uptime)
                       $(report_disk_space)
                       $(report_home_space)
           </BODY>
      </HTML>
_eof_

我尝试将EOF移动到线的开头,并没有做太多。这个脚本在我正在阅读的命令行书中,我完全复制了脚本并且它抛出了EOF错误。我猜是因为这本书可能已经过时了。

再次感谢所有帮助。

1 个答案:

答案 0 :(得分:2)

你的HEREDOC终结者是非常的。它们必须位于该行的开头。

e.g。

cat << EOF
   foo bar
   EOF
^^^--these spaces matter

由于这些空格,终结符被视为[space][space][space]EOF,并且永远不会与EOF匹配。

由于您的第一个EOF永远不会终止,因此shell会在脚本末尾运行而不会看到fi,因为您拥有的fi实际上被视为输出,而不是控制序列。< / p>