2012-12-02 23 views
1

我无法获得此脚本。我只是想在没有使用wc的情况下计算文件中的行数。这里是我迄今为止在bash shell脚本中计数换行符

FILE=file.txt 
lines=0 
while IFS= read -n1 char 
do 
if [ "$char" == "\n" ] 
then 
lines=$((lines+1)) 
fi 
done < $FILE 

这是一个更大的脚本,应在文件中算总的话,字符和线条的只是一小部分。尽管如此,我无法弄清楚。请帮助

问题是if语句的条件从不是真的。它就好像程序无法检测到'\ n'是什么。

+0

我的回答的一些测试和编辑后,我的答案现在应该提供:-) – poplitea

+0

你Q的称号工作的例子计数“\ n”,但在你的Q,第一句话你说要算行数。他们不一样。如果你回声-n“abc”> file.txt' wc并且你的脚本(被下面的好人纠正)将返回0,但file.txt中有一行。这可能不是你的情况,但我只是提醒你。 – Kent

回答

2
declare -i lines=0 words=0 chars=0 
while IFS= read -r line; do 
    ((lines++)) 
    array=($line)    # don't quote the var to enable word splitting 
    ((words += ${#array[@]})) 
    ((chars += ${#line} + 1)) # add 1 for the newline 
done < "$filename" 
echo "$lines $words $chars $filename" 
1

你有两个问题。他们被固定在下面:

#!/bin/bash 
file=file.txt 
lines=0 
while IFS= read -rN1 char; do 
if [[ "$char" == $'\n' ]]; then 
    ((++lines)) 
fi 
done < "$file" 

的一个问题是$'\n'测试,另外一个更微妙的,是你需要使用-N开关,而不是-n一个在读(help read更多信息)。哦,你也想使用-r选项(当你在你的文件中有反斜杠时选择是否选中)。

我改变了一些小的东西:使用更健壮的[[...]],使用小写变量名(大写变量名被认为是不好的做法)。用算术((++lines))代替愚蠢的lines=$((lines+1))