web-dev-qa-db-fra.com

Bash for loop - comment puis-je inclure des nouvelles lignes vierges? (IFS)

Notez que ceci est un pseudo-code, et je n'essaie pas de compter les lignes de cette façon, cette question consiste à comprendre comment inclure des nouvelles lignes totalement vides dans une boucle for.

cat file

Word



Word

Puisqu'il y a un total de 5 lignes, x doit être égal à 5 ​​à la fin.

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

echo $x

Cependant, les nouvelles lignes vierges ne sont pas comptées et x est égal à 2 au lieu de 5.

Je pensais que le IFS=$'\n' aurait fait ce travail comme je le voulais. Quelqu'un peut-il s'il vous plaît expliquer comment faire les "newlines" vierges être "compté" dans la boucle?

2
TuxForLife

Vous pouvez le faire en utilisant read dans une boucle while au lieu d'une boucle for:

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



Word
~$ bash script.sh
5
1
kos

Vous ne pouvez pas faire cela en utilisant la division du champ du shell.

Les caractères d'espacement blancs adjacents de IFS sont analysés, vous ne pouvez donc pas utiliser la division de champ pour distinguer les caractères IFS d'espaces blancs adjacents. Du standard ( Shell et utilitaires , section 2.6.5 ):

Chaque occurrence dans l'entrée d'un caractère IFS qui n'est pas un espace blanc IFS, ainsi que de tout espace blanc IFS adjacent, doit délimiter un champ, comme décrit précédemment.

C'est comme ça.

Puisqu'il s'agit d'une question hypothétique, et que vous n'avez pas précisé ce que vous êtes en train de faire, je ne proposerai pas d'autre solution.

4
muru

Je pense que vous devrez utiliser while read line à la place:

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