Você pode fazer isso usando read
em um loop while
em vez de um for
loop:
#!/bin/bash
while read line; do
((x++))
done < file
echo $x
exit 0
~$ cat file
word
word
~$ bash script.sh
5
Por favor, note que este é pseudocódigo, e eu não estou tentando contar as linhas desta forma, esta questão é descobrir como incluir novas linhas completamente em branco em um loop for.
cat file
word
word
Como há um total de 5 linhas, x deve ser igual a 5 no final.
IFS=$'\n'
x=0
for line in $(cat file) ; do
x=$(($x+1))
done
echo $x
No entanto, as novas linhas em branco não estão sendo contadas e x é igual a 2 em vez de 5.
Eu achei que o IFS=$'\n'
teria feito isso funcionar como eu queria. Alguém pode explicar como fazer com que as novas linhas em branco sejam "contadas" no loop for?
Você pode fazer isso usando read
em um loop while
em vez de um for
loop:
#!/bin/bash
while read line; do
((x++))
done < file
echo $x
exit 0
~$ cat file
word
word
~$ bash script.sh
5
Você não pode fazer isso usando a divisão de campo do shell.
Os caracteres de espaço em branco adjacentes de IFS
são analisados juntos, portanto, você não pode usar a divisão de campo para distinguir entre os caracteres IFS de espaços em branco adjacentes. Do padrão ( Shell e utilitários , seção 2.6.5 ):
Cada ocorrência na entrada de um caractere IFS que não seja espaço em branco IFS, juntamente com qualquer espaço em branco IFS adjacente, deve delimitar um campo, conforme descrito anteriormente.
É assim que é.
Como esta é uma questão hipotética, e você não disse exatamente o que está fazendo, não vou sugerir outra maneira.
Acho que você precisará usar while read line
:
x=0
while read line ; do
x=$(($x+1))
done