BASH 脚本返回“文件意外结束”

BASH 脚本返回“文件意外结束”

不知道为什么我会得到这个。我意识到这一定是一个常见问题,但无法弄清楚。

#!/bin/bash
 #Checks word count of each text file directory and deletes if less than certain   amount of words
 #Lastly, displays number of files delter

 count = 0 #Set counter to 0
 limit = 2000

 for file in *.txt
 do
     words = wc -w > $file
     if words < $limit
         rm $file
         count = $count + 1
     end
 end

 print "Number of files deleted: $count" 

答案1

恐怕您的脚本充满了语法错误。您看到的具体错误是因为您没有for正确关闭循环,但还有很多很多:

  1. =给变量赋值时,不能有空格(算术表达式除外);
  2. 为了将命令的输出保存在变量中,您必须使用命令替换, 两者var=`command`任一var=$(command);
  3. 引用变量的值时,必须使用$var, 而不是var,一般需要用引号 ( "$var") 括起来;
  4. 当做一个算术比较,您需要使用命令-lt[<除非您使用双括号;
  5. command > file格式将file被命令的输出覆盖。你可能想使用wc < "$file"而不是wc > $file;
  6. var=$var+1除非该变量之前已声明为整数,否则无法使用((var=var+1))var=$((var+1))或向变量添加值declare -i var; var=var+1。要加 1,您还可以使用((var++));
  7. 你的if语法是错误的。正确的格式是if condition; then do something; fi
  8. 循环也是如此for,正确的语法是for loop-specification; do something; done;
  9. 没有print命令(无论如何不是在 bash 中内置的),只有printfecho;
  10. 你应该总是引用你的变量除非有充分的理由不这样做。

因此,经过轻微改进的脚本的工作版本将是:

#!/bin/bash -
# Checks word count of each text file directory and deletes if less than certain   amount of words
# Lastly, displays number of files deleted

count=0 # Set counter to 0
limit=2000

for file in *.txt
do
     words=$(wc -w < "$file")
     if [ "$words" -lt "$limit" ]
     then
         rm -- "$file"
         ((count++))
     fi
done

echo "Number of files deleted: $count" 

下次,我建议您在尝试使用一种语言编写代码之前先熟悉它。每种语言都有自己的规则和语法。

答案2

您的循环终止符不正确。循环由, notfor终止。同样,条件由 终止,而不是由 终止。doneendiffiend

这是 Bourne/POSIX 系列 shell 语法。其他 shell 可能确实有以 结尾的这两件事end,但bash事实并非如此。

答案3

words = wc -w > $file

这里的字符>似乎不合适。如果没有它,您将计算 的行数,$file但就目前情况而言,您正在计算 stdin 的行数并将结果输出到$file.

相关内容