Yo leí que es malo para las cosas de escritura como for line in $(command)
, la forma correcta parece ser en su lugar:
command | while IFS= read -r line; do echo $line; done
Esto funciona muy bien. Pero, ¿qué sucede si lo que quiero repetir es el contenido de una variable , no el resultado directo de un comando?
Por ejemplo, imagine que crea el siguiente archivo quickfox
:
The quick brown
foxjumps\ over -
the
lazy ,
dog.
Me gustaría poder hacer algo como esto:
# This is just for the example,
# I could of course stream the contents to `read`
variable=$(cat quickfox);
while IFS= read -r line < $variable; do echo $line; done; # this is incorrect
$variable
cuando lo usa, de lo contrario, elwhile
bucle obtendrá solo una línea de entrada. Véase, por ejemplo, la diferencia de salida entreecho $variable
vsecho "$variable"
ocat <<< $variable
vscat <<< "$variable"
.variable=$(cat quickfox)
pregunta en el OP en sí proporciona un ejemplo de lo que estaba hablando. El uso$variable
de comillas dobles internas incluye las nuevas líneas, el uso sin las nuevas líneas se traduce en espacios por el shell. Si está leyendo y procesando línea por línea, esto hace una gran diferencia: con el primero tiene múltiples líneas de entrada, con el último solo tiene una línea de entrada. Los datos de entrada son superficialmente similares pero, en la práctica, completamente diferentes en esos dos casos.cat <<< "$variable" | wc -l
devuelve 5.cat <<< $variable | wc -l
devuelve 1. Si desea / necesita preservar espacios en blanco (incluyendo líneas nuevas, tabulaciones, espacios simples o múltiples) en una variable, DEBE comillas dobles la variable cuando la use, de lo contrario todos se transformarán en un solo espacio entre cada "palabra".