/shell-script:意外标记“done”附近出现语法错误

/shell-script:意外标记“done”附近出现语法错误

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-doneandif-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 脚本文件中您不会收到该错误。

相关内容