script for filtros comando linux bash shell

linux - for - Redirigir la salida de bash para el bucle



script unix (3)

Tengo un comando BASH simple que se parece a

for i in `seq 2`; do echo $i; done; > out.dat

Cuando esto se ejecuta, la salida de la seq 2 se envía al terminal y nada se envía al archivo de datos (out.dat)

Estoy esperando que se redireccione la salida estándar a out.dat, simplemente ejecuta el comando seq 2 > out.dat


Otra posibilidad, para completar: puede mover la salida dentro del bucle, usando >> para anexar al archivo, si existe.

for i in `seq 2`; do echo $i >> out.dat; done;

Cuál es mejor depende ciertamente del caso de uso. Escribir el archivo de una vez es mejor que anexarlo mil veces. Además, si el ciclo contiene múltiples instrucciones de echo , todas las cuales irán al archivo, hacer done > out.dat es probablemente más legible y más fácil de mantener. La ventaja de esta solución, por supuesto, es que brinda más flexibilidad.


Tratar:

(for i in `seq 2`; do echo $i; done;) > out.dat


Retire su punto y coma.

for i in `seq 2`; do echo "$i"; done > out.dat

SUGERENCIAS

También como lo sugirió Fredrik Pihl, trate de no usar binarios externos cuando no los necesite, o al menos cuando prácticamente no:

for i in {1..2}; do echo "$i"; done > out.dat for ((i = 1; i <= 2; ++i )); do echo "$i"; done > out.dat for i in 1 2; do echo "$i"; done > out.dat

Además, tenga cuidado con los resultados en words que pueden causar la expansión del nombre de ruta.

for A in $(echo ''*''); do echo "$A"; done

Mostraría sus archivos en lugar de solo un literal * .

$() también se recomienda como una sintaxis más clara para la sustitución de comandos en los shells Bash y POSIX que en los backticks ( ` ), y admite el anidamiento.

Las soluciones más limpias así como para leer la salida a las variables son

while read VAR; do ... done < <(do something)

Y

read ... < <(do something) ## Could be done on a loop or with readarray. for A in "${ARRAY[@]}"; do : done

El uso de printf también puede ser una alternativa más fácil con respecto a la función prevista:

printf ''%s/n'' {1..2} > out.dat