2

このスクリプトをまったく機能させることができません。wcを使用せずにファイルの行数を数えようとしています。これが私がこれまでに持っているものです

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

これは、ファイル内の単語、文字、および行の合計をカウントする大きなスクリプトのほんの一部です。私はそれを理解することはできません。助けてください

問題は、if ステートメントの条件が真にならないことです。まるでプログラムが '\n' を検出できないかのようです。

4

2 に答える 2

2

そこには2つの問題があります。それらは次のように修正されています。

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

1 つの問題はテストで、もう 1 つのより微妙な問題は、読み取り中のものではなく、スイッチ$'\n'を使用する必要があることでした (詳細については)。ああ、あなたもオプションを使いたいと思っています(ファイルにバックスラッシュがある場合は、有無にかかわらずチェックしてください)。-N-nhelp read-r

マイナーな変更点: より堅牢な[[...]]小文字の変数名を使用します (大文字の変数名を使用するのは悪い習慣と見なされます)。((++lines))ばかげたの代わりに算術を使用しましたlines=$((lines+1))

于 2012-12-02T23:14:42.753 に答える
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"
于 2012-12-03T02:14:24.443 に答える