Estoy tratando de ejecutar un for
bucle para el archivo y quiero mostrar la línea completa. Pero, en cambio, solo muestra la última palabra. Quiero la linea completa.
for j in `cat ./file_wget_med`
do
echo $j
done
resultado después de la ejecución:
Found.
Aquí están mis datos:
$ cat file_wget_med
2013-09-11 14:27:03 ERROR 404: Not Found.
command-line
bash
scripts
usuario192118
fuente
fuente
Respuestas:
for
el bucle se divide cuando ve cualquier espacio en blanco como espacio, tabulación o nueva línea. Por lo tanto, debe usar IFS (separador de campo interno) :fuente
unset IFS
después, para que otros comandos no se vean influenciados en este mismo shell.$
enIFS=$'\n'
?$
hace que los saltos de línea funcionen dentro de la cadena. Esto también debe hacerselocal IFS=$'\n'
dentro de una función.$'...'
conoce " Cita ANSI-C "for
los bucles se dividen en cualquier espacio en blanco (espacio, tabulación, nueva línea) de forma predeterminada; la forma más fácil de trabajar en una línea a la vez es usar unwhile read
bucle, que se divide en líneas nuevas:Me gustaría contar con su mando a escupir una palabra por línea (que es lo que pasó cuando lo probé con un archivo de mi propia). Si algo más está sucediendo, no estoy seguro de qué podría estar causándolo.
fuente
for i in `ls`; do echo $1; done
, canalizando el resultado del comando, mientras que:ls|while read i; do echo $i; done
. Esto funciona en nombres de archivos / carpetas con espacios, sin necesidad de cambiar las variables de entorno. Muy buena respuesta.ls
no se considera seguro para su uso con|
(el operador de la tubería).find
es más flexible además de ser más seguro para este propósito.pbpaste | while read t; do echo "<string>$t</string>"; done
ls -1
puede usarse con|
para garantizar una salida sin formato de una por líneaTrabajo verificado, no el único revestimiento que probablemente desee, pero no es posible hacerlo con elegancia.
fuente
Aquí hay una pequeña extensión de la respuesta de Mitchell Currie, que me gusta debido al pequeño alcance de los efectos secundarios, que evita tener que establecer una variable:
fuente
-name '*'
y sería lo mismo, ¿no?Lo escribiría así:
ya que requiere cambios mínimos en el script original (excepto para el uso de la solución
IFS
, pero modifica elbash
comportamiento no solo para esta declaración de control de bucle).fuente
cat
son innecesarios aquí.while
el bucle acepta la redirección muy bien, por lo que esto generalmente se escribe comowhile IFS= read -r line; do...done < input.txt
Mapfile es una forma conveniente de leer líneas de un archivo en una matriz indexada, no tan portátil como la lectura, pero un poco más rápido. Al usar for loop evitas crear una subshell.
Tenga en cuenta que cuando use tuberías, colocará el bucle while en una subshell. Los cambios dentro del ciclo while como variables no se propagarán a la parte externa del script.
Ejemplo:
(Mejor solución):
fuente
Dandalf se acercó mucho a una solución funcional, ¡pero NUNCA se debería tratar de asignar el resultado de cantidades desconocidas de entrada (es decir
find ~/.gdfuse -name '*'
) a las variables! O, al menos, intente hacer tal cosa a través de una variable de matriz; si insistes en ser tan vago! Entonces, aquí está la solución de Dandalf hecha sin la peligrosa maniobra; y todo en una líneafuente