Digamos que tengo este archivo:
hello
world
hello world
Este programa
#!/bin/bash
for i in $(cat $1); do
echo "tester: $i"
done
salidas
tester: hello
tester: world
tester: hello
tester: world
Sin for
embargo, me gustaría que la iteración sobre cada línea ignore los espacios en blanco, es decir, las dos últimas líneas deben reemplazarse por
tester: hello world
El uso de comillas for i in "$(cat $1)";
resulta en que i
se le asigne todo el archivo de una vez ¿Qué debería cambiar?
fuente
<
un ciclo completo. Aunque tiene mucho sentido ahora lo viIFS \ read -r line' in second example. Is really
IFS = `¿necesario? En mi humilde opinión es suficiente decir:while read -r line; do echo "tester: $line"; done < "$1"
IFS=
desactiva la eliminación de los espacios en blanco iniciales y finales. Ver Enwhile IFS= read..
, ¿por qué IFS no tiene ningún efecto?Para lo que vale, necesito hacer eso con bastante frecuencia, y nunca puedo recordar la forma exacta de usarlo
while IFS= read...
, así que definí la siguiente función en mi perfil de bash:Esta función primero determina el número de líneas en el archivo, luego usa
sed
para extraer línea tras línea y pasa cada línea como un argumento de cadena simple a cualquier función dada. Supongo que esto podría volverse realmente ineficiente con archivos grandes, pero eso no ha sido un problema para mí hasta ahora (sugerencias sobre cómo mejorar esta bienvenida, por supuesto).El uso es bastante dulce IMO:
fuente