syntax error near unexpected token done
我在执行 shell 脚本时得到:
while read filename
do
echo "$filename"
if [ -s $filename ]; then
tail -10 $filename | grep `date '+%Y-%m-%d'` >> $lastlines1
echo "- Next Error File - " >> $lastlines1
done
else
echo " no errrors"
fi
有什么想法吗,我哪里错了?
答案1
你正在关闭 if 之前的 while 。
while read filename
do
echo "$filename"
if [ -s $filename ]
then
tail -10 $filename | grep date '+%Y-%m-%d' >> $lastlines1
echo "- Next Error File - " >> $lastlines1
else
echo " no errrors"
fi
done
答案2
让我们添加一些新行和缩进:
1 while read filename; do
2 echo "$filename"
3 if [ -s $filename ]; then
4 tail -10 $filename | grep date '+%Y-%m-%d' >> $lastlines1
5 echo "- Next Error File - " >> $lastlines1
6 done
7 else
8 echo " no errrors"
9 fi
第6行和第9行似乎互换了。换句话说,while-do-done
andif-then-else-fi
子句是重叠的。这在 shell(以及大多数其他计算机语言)中是错误的。
答案3
您需要使用vim
编辑器来编写脚本,如果语法错误,它将以红色显示文本
while read FileName
do
echo "${FileName}"
if [ -s "${FileName}" ]; then
tail -10 $FileName | grep "date '+%Y-%m-%d'" >> "${lastlines1}"
echo "- Next Error File - " >> "${lastlines1}"
else
echo " no errrors"
fi
done
答案4
有时,此错误是由于文件中出现意外的 CR 字符而发生的,通常是因为该文件是在使用 CR 行结尾的 Windows 系统上生成的。您可以通过运行dos2unix
或 来修复此问题tr
,例如:
tr -d '\015' < yourscript.sh > newscript.sh
这将从文件中删除所有 CR 字符,并且在新的 shell 脚本文件中您不会收到该错误。