0

現在のディレクトリのすべての「.cpp」の行数をカウントするシェルスクリプトを作成するように求められます。

しかし、シェルスクリプトを実行すると、count.sh: line 13: syntax error near unexpected token "done"
何が問題なのかわからないと表示されました。

誰かがこの問題を解決する方法を教えてもらえますか?ご協力いただきありがとうございます。

#!/bin/bash

summary=0
for i in $(find . -name *.cpp -print) 
do
count=$(wc -l $i)
let summary+=count
if [$count -eq 1]
then 
    echo "$i : $count line"
elif [$count -gt 1]
    echo "$i : $count lines"        
done

if [$summary -eq 1]
then 
echo "TOTAL: $summary   line"

elif [$summary -gt 1]
echo "TOTAL: $summary   lines"
4

2 に答える 2

5

fiの前にがありませんdoneifステートメントをで終了する必要があります。fiその後、ループdoneを終了する必要があります。for

例:UPDATE次の例は、このスクリプトを正しくするために必要なすべてではありません。OPが見た「初期」エラーの理由はそれであったため、ここではそのままにしておきます。その他の修正については、以下をお読みください。

for i in $(find . -name *.cpp -print) 
do
  count=$(wc -l $i)
  let summary+=count
  if [$count -eq 1]
  then 
      echo "$i : $count line"
  elif [$count -gt 1]
      echo "$i : $count lines"        
  fi
done

また、それは単なるコピー/貼り付けエラーである可能性がありますが、コード/スクリプトの最後に、が完全に欠落していfiます。

スクリプトにいくつかのエラーがあります。まず、正しいバージョンは次のとおりです。

for i in $(find . -name *.cpp -print)
do
     count=$(wc -l $i | cut -f1 -d' ')
     let summary+=$count
     if [ $count -eq 1 ];
     then
       echo "$i : $count line"
     elif [ $count -gt 1 ];
     then
       echo "$i : $count lines"
     fi
done

修正:

  • の出力wc -lはのような12 ./filenameので、行数だけを使用するには、それを抽出する必要があります。私cutはその目的のために使用しました。
  • このletコマンドでは、実際にリテラル値または変数を追加する必要があります。したがって、を使用する必要があります$countcountこれは文字列の数であり、他のものに追加することはできません。
  • ;あなたはテスト条件の後に置く必要があります。
  • ブロック自体と同じように、でelifブロックを導入する必要があります。thenif
于 2012-05-03T12:35:30.187 に答える
0
if [$count -eq 1]
then 
    echo "$i : $count line"
elif [$count -gt 1]
    echo "$i : $count lines"
done

する必要があります

if [$count -eq 1]
then 
    echo "$i : $count line"
elif [$count -gt 1]
    echo "$i : $count lines"
fi                           # << this line is new
done
于 2012-05-03T12:37:41.050 に答える