2011-01-09 15 views
33

Quiero hacer lo siguiente, leer línea por línea de un archivo y utilizar el valor por línea como paramsLeer línea por línea en escritura del golpe

FILE="cat test" 
echo "$FILE" | \ 
while read CMD; do 
echo $CMD 
done 

pero cuando lo haga el eco $ CMD, sólo devuelve cat: S

Respuesta

55

Lo que tienes es conectar el texto "cat test" al lazo.

lo que desea es:

cat test | \ 
while read CMD; do 
    echo $CMD 
done 
86
FILE=test 

while read CMD; do 
    echo "$CMD" 
done < "$FILE" 

Hay algunas mejoras adicionales que se podrían hacer (gracias @RanyAlbegWein):

  • Añadir IFS=read de manera que no recortará iniciales y finales espacios en blanco de cada línea.
  • Agregue -r para leer para evitar que las barras diagonales inversas se interpreten como secuencias de escape.
  • Minúscula CMD y FILE. La convención de bash es solo ambiental y las variables de shell internas son mayúsculas.
  • printf uso en lugar de echo que es más seguro si $cmd es una cadena como la que -necho interpretaría como una bandera.

Resultado:

file=test 

while IFS= read -r cmd; do 
    printf '%s\n' "$cmd" 
done < "$file" 
+14

+1 para evitar el uso inútil de 'cat'. –

+5

+1 para el acceso de variables fuera del bucle – former

+5

+1 para la tubería en el bucle while. Me gustaría señalar a la audiencia, sin embargo, que uno puede simplemente llamar 'mientras lee; no utilizar la variable * REPLY * incorporada. –

1

¿Quiere decir que hacer:

cat test | \ 
while read CMD; do 
echo $CMD 
done 
2

Si desea utilizar cada una de las líneas del archivo como parametros de línea de comandos para su aplicación puedes hacer usa el comando xargs. archivo

xargs -a <params_file> <command> 

Un params con:

a 
b 
c 
d 

y el archivo tr.py:

import sys 
print sys.argv 

La ejecución de

xargs -a params ./tr.py 

da el resultado:

['./tr.py', 'a', 'b', 'c', 'd'] 
0

La versión correcta de su script es la siguiente;

FILE="cat test" 
$FILE | \ 
while read CMD; do 
echo $CMD 
done 

Sin embargo, este tipo de direccionamiento indirecto - poner su comando en una variable llamada ARCHIVO-- es innecesario. Use una de las soluciones ya provistas. Solo quería señalar tu error.

10

xargs es la solución más flexible para dividir la salida en argumentos de comando.

También es muy legible y fácil de usar debido a su parametrización simple.

El formato es xargs -n $NUMLINES mycommand.

Por ejemplo, para echo cada línea individual en un archivo /tmp/tmp.txt que haría:

cat /tmp/tmp.txt | xargs -n 1 echo 

O a diff cada par sucesivo de archivos que aparecen como líneas en un archivo de nombre anterior que haría :

cat /tmp/tmp.txt | xargs -n 2 diff 

El -n 2 instruye xargs para consumir y pasar como argumentos separados dos líneas de lo que ha tocado la flauta en él a la vez.

Puede personalizar xargs para dividir en delimitadores además de carriage return/newline.

Utilice man xargs y google para obtener más información sobre el poder de esta versátil utilidad.

Cuestiones relacionadas