文件结束警告

文件结束警告

有人能解释一下为什么文件结尾在第 49 行是意外的吗?(第 49 行是最后一行之后的一行)

#!/bin/bash 

timeend=$(date -u +%H%M)
timestart=$(date --date "$timeend 30 minutes ago" -u +%H%M)
firsttime=0

while true
do
    if [[ $firsttime -eq 0 ]]; then
    time=$timestart
    increment=0
    fi
    if [[ $firsttime -ne true ]]; then
    increment=$(( $increment + 2 ))
    time=$(( $timestart + $increment ))
    fi
    if [[ $time -ge $timeend ]]; then
    break
    fi 

    gpnids << EOF
    RADFIL   = NEXRIII|CLT|TR0
    RADTIM   = "$time"
    TITLE    = 1/-2
    PANEL    = 0
    DEVICE   = gif|radar"$increment".gif|1280;1024|C
    CLEAR    = Y
    TEXT     = 1/2/2/hw
    COLORS   = 7
    WIND     =  
    LINE     =  
    CLRBAR   =  
    IMCBAR   = 5/v/LL/.005;.6/.4;.01
    GAREA    = dset
    MAP      = 24 + 23 + 1/1/2 + 14 + 15/1/2
    LATLON   = 0
    OUTPUT   = t

    $mapfil = lorvus.usg + hicnus.nws + hipona.nws + louhus.nws + loisus.nws
    run

    exit
    EOF
    firsttime=1

    gpend

 done

答案1

您还应该收到另一个可能更具参考价值的错误:

/home/terdon/scripts/b.sh:第 49 行:警告:第 21 行的此处文档由文件末尾分隔(需要“EOF”)

/home/terdon/scripts/b.sh:第 50 行:语法错误:文件意外结束

你的错误在于,在结束 heredoc 的字符串之前有空格。举一个简单的例子,这个抱怨:

#!/bin/bash 

cat << EOF
   hello
   EOF

但事实并非如此:

#!/bin/bash 

cat << EOF
   hello
EOF

答案2

我得到两行代码应该可以帮助你弄清楚发生了什么:

./test: line 48: warning: here-document at line 21 delimited by end-of-file (wanted `EOF')
./test: line 49: syntax error: unexpected end of file

您的heredoc( << EOF) 构造不正确。它对空格敏感,因此您可以将其删除:

...
    command <<EOF
        ...
EOF

或者让它知道你正在标记它(并且它必须是一个标签):

...
    command <<-EOF
        ...
    EOF

我更喜欢第二种,因为它可以让你更好地构建脚本......你的脚本已经从中受益了。

答案3

文件结束警告

%>: 第 49 行:警告:第 21 行的此处文档由文件末尾分隔(需要“EOF”)

  • heredoc 正在寻找分隔符(结束标记),在本例中EOF
  • 在您的示例中,它永远不会被识别,因为它以空格为前缀
  • 到达实际文件末尾却找不到分隔符,因此出现警告

可以通过删除空格来解决,或者Terndon 指出使用标签——我不知道这一点


其他

另一个常见的文件结尾错误与空格问题有关。通常是从在线复制针对 Windows 格式化的代码并在 Linux 中运行它而来的。

dos2unix可以通过在文件上运行来快速转换这些字符来解决此问题。

答案4

如果你正在使用 vim 或 vi,请尝试使用命令

:set list

您将能够看到符号之间的空格$

有时它可以派上用场,帮助解决一些意想不到的行为。
在这种情况下,删除空格就完成了工作。

相关内容