/shell-script: 予期しない「完了」マークの近くで構文エラーが発生しました。

/shell-script: 予期しない「完了」マークの近くで構文エラーが発生しました。

syntax error near unexpected token doneシェルスクリプトを実行すると、次の結果が表示されます。

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-doneif-then-else-fi句が重なります。これはシェル(および他のほとんどのコンピュータ言語)では無効です。

答え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文字が削除され、新しいシェルスクリプトファイルでエラーが発生しなくなります。

関連情報