Si usa cadenas directamente bajo un for
bucle, funcionará por palabra (aquí en una palabra: todo el contenido de $test
desde que se cita), no por carácter. Debe usar un while
bucle con read
para analizar letra por letra o para introducir un parámetro numérico que se repita en la cadena.
Además, al usarlo read
, debe asegurarse de que las líneas nuevas y los espacios en blanco no se interpreten como delimitadores y forzar la read
lectura de un carácter a la vez.
Aquí hay una versión funcional:
#!/bin/bash
test="this is a
test"
printf %s "$test" | while IFS= read -r -N 1 a; do
if [[ "$a" == $'\n' ]] ; then
echo "FOUND NEWLINE"
fi
printf %s "$a"
done
Puede reemplazar $'\n'
con $'\012'
o $'\x0a'
, ya que todos representan el mismo código de nueva línea. Pero no es lo mismo que \015
o \r
, esto significa retorno de carro (retorno al comienzo de la línea). En los sistemas Linux, las nuevas líneas se representan usando \n
, pero en Windows, por ejemplo, se representan mediante una secuencia de en su \r\n
lugar. Es por eso que si tuviera un archivo de texto de Windows, también podría detectar nuevas líneas buscando \r
.
cat | while read line; do ...; done
, sabe que hubo un retorno de carro para cada iteración. Si su entrada puede ser archivos\r
sin\n
, simplemente transforme el archivotr '\r' '\n'
mientras procesa la entrada. Si sólo necesita saber si hay varias líneas:wc -l
.