有人能解释一下为什么文件结尾在第 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
您将能够看到符号之间的空格$
有时它可以派上用场,帮助解决一些意想不到的行为。
在这种情况下,删除空格就完成了工作。