count.sh:第13行:意外令牌“完成”附近的语法错误

时间:2012-05-03 12:34:08

标签: linux shell

我要求编写一个shell脚本来计算行数 在当前目录中的所有“.cpp”中。

但是,在运行我的shell脚本时, 它说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"

2 个答案:

答案 0 :(得分:5)

您在fi之前错过了done。您必须使用if结束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命令要求您实际添加文字值或变量。因此,您需要使用$count而不仅仅是count,这只是字符串计数,无法添加到其他内容中。
  • 您需要在测试条件之后放置;
  • 您需要使用elif引入then块,就像if块本身一样。

答案 1 :(得分: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