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 $IFS
absorbiendo 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á.