Bash para loop - como posso incluir novas linhas em branco? (IFS) [fechado]

2

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?

    
por TuxForLife 26.07.2015 / 08:29

3 respostas

1

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 kos 26.07.2015 / 09:00
4

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.

    
por muru 26.07.2015 / 08:58
2

Acho que você precisará usar while read line :

x=0
while read line ; do
    x=$(($x+1))
done
    
por wilx 26.07.2015 / 09:00