web-dev-qa-db-ja.com

Bash for Loop-空白の改行を含めるにはどうすればよいですか? (IFS)

これは擬似コードであり、この方法で行をカウントしようとはしていないことに注意してください。この質問は、forループに完全に空白の改行を含める方法を見つけることです。

cat file

Word



Word

合計5行あるため、xは最後に5になります。

IFS=$'\n'
x=0
for line in $(cat file) ; do
x=$(($x+1))
done

echo $x

ただし、空白の改行はカウントされず、xは5ではなく2になります

IFS=$'\n'は、私が望んでいたようにこの作品を作っていたでしょう。誰かがforループで空白の改行を「カウント」する方法を説明できますか?

2
TuxForLife

readループの代わりにwhileループでforを使用してこれを行うことができます。

#!/bin/bash
while read line; do
    ((x++))
done < file
echo $x
exit 0
~$ cat file
Word



Word
~$ bash script.sh
5
1
kos

シェルのフィールド分割を使用してこれを行うことはできません。

IFSからの隣接する空白文字は一緒に解析されるため、フィールド分割を使用して隣接する空白IFS文字を区別することはできません。標準(ShellおよびUtilitiesセクション2.6.5 )から:

IFSの空白ではないIFS文字の入力での各出現は、隣接するIFSの空白とともに、前述のようにフィールドを区切る必要があります。

それだけです。

これは仮説的な質問であり、あなたがやっていることを正確に言っていないため、別の方法を提案することはしません。

4
muru

代わりにwhile read lineを使用する必要があると思います。

x=0
while read line ; do
    x=$(($x+1))
done
2
wilx