2012-12-02 24 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))