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?
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
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.
Je pense que vous devrez utiliser while read line
à la place:
x=0
while read line ; do
x=$(($x+1))
done