不知道为什么我会得到这个。我意识到这一定是一个常见问题,但无法弄清楚。
#!/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
正确关闭循环,但还有很多很多:
=
给变量赋值时,不能有空格(算术表达式除外);- 为了将命令的输出保存在变量中,您必须使用命令替换, 两者
var=`command`
任一var=$(command)
; - 引用变量的值时,必须使用
$var
, 而不是var
,一般需要用引号 ("$var"
) 括起来; - 当做一个算术比较,您需要使用命令
-lt
的[
,<
除非您使用双括号; - 该
command > file
格式将file
被命令的输出覆盖。你可能想使用wc < "$file"
而不是wc > $file
; var=$var+1
除非该变量之前已声明为整数,否则无法使用((var=var+1))
、var=$((var+1))
或向变量添加值declare -i var; var=var+1
。要加 1,您还可以使用((var++))
;- 你的
if
语法是错误的。正确的格式是if condition; then do something; fi
- 循环也是如此
for
,正确的语法是for loop-specification; do something; done
; - 没有
print
命令(无论如何不是在 bash 中内置的),只有printf
和echo
; - 你应该总是引用你的变量除非有充分的理由不这样做。
因此,经过轻微改进的脚本的工作版本将是:
#!/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
终止。同样,条件由 终止,而不是由 终止。done
end
if
fi
end
这是 Bourne/POSIX 系列 shell 语法。其他 shell 可能确实有以 结尾的这两件事end
,但bash
事实并非如此。
答案3
words = wc -w > $file
这里的字符>
似乎不合适。如果没有它,您将计算 的行数,$file
但就目前情况而言,您正在计算 stdin 的行数并将结果输出到$file
.