Saltar al contenido

Bash Read: leyendo una lista separada por comas, se pierde el último elemento

Te sugerimos que revises esta respuesta en un entorno controlado antes de pasarlo a producción, un saludo.

Solución:

Con read, -d se usa para Terminar las líneas de entrada (es decir, no separar las líneas de entrada). Su última “línea” no contiene terminador, por lo que read devoluciones false en EOF y el bucle sale (aunque se leyó el valor final).

echo '0,1,2,3,4,5' |  while read -d, i; do echo "$i"; done; echo "last value=$i"; 

(Incluso con -d, read también usa $IFSabsorbiendo espacios en blanco, incluido el final n en el valor final que aparecería usando otros métodos tales como readarray)

Las preguntas frecuentes de Bash analizan esto y cómo manejar varios casos similares:

  • Trampas de la fiesta #47 IFS=, leer […]
  • Preguntas frecuentes sobre Bash 001 como puedo leer un archivo […] linea por linea
  • Preguntas frecuentes sobre Bash 005 ¿Cómo puedo usar array variables?

Como dicen otras respuestas, -d es un carácter de final de línea, no un separador de campo. Tu puedes hacer

IFS=, read -a fields <<< "1,2,3,4,5"
for i in "$fields[@]"; do echo "$i"; done

del hombre:

-d delimitar

El primer carácter de delim se usa para terminar la línea de entrada, en lugar de una nueva línea.

Su elemento 5 no tiene un delimitador (coma), por lo que no se leerá.

Aquí puedes ver las comentarios y valoraciones de los usuarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *