2010-06-24 20 views

Respuesta

23

Debe usar el comando read.

otool -L MyApplication | sed 1d | \ 
while read i 
do 
    echo "line: " $i 
done 

Ver bashref para una descripción de la orden interna de lectura, y sus opciones. También puede echar un vistazo a los siguientes tutorial para ver ejemplos de cómo usar read junto con for.

+7

Advertencia: si usted necesita para establecer las variables en el bucle while (es decir, almacenar lo que ha encontrado en la producción de otool), van a desaparecer tan pronto como el bucle termina porque es parte de una tubería y, por lo tanto, se ejecuta en una subcapa. En bash, puede evitar esto con un poco de reorganización: 'mientras leí i; do ... done <<(otool -L MyApplication | sed 1d) ' –

+1

Otra advertencia: Esto eliminará una gran cantidad de espacios y barras diagonales inversas. Use 'read -r i' para leer líneas sin tales modificaciones. – Jens

+0

@Jens, no, es el comando echo que come espacios. la línea 'echo ': $ i" 'evitará eso. –

0

Puede usar awk para procesar cosas por línea. Sin embargo, la mejor manera de hacerlo depende de lo que intentes hacer.

7
otool -L MyApplication | sed 1d | while read line ; 
do 
    # do stuff with $line 
done 
3

Intente cambiar el Separador de campo interno a una nueva línea. Por defecto, bash va a separar tokens por espacios cuando usa un bucle for. Su configuración IFS hará que el bucle for divida los tokens en función de cualquier cadena en la que IFS sea igual (dividiendo así los tokens de lista por líneas nuevas en lugar de tokens por espacios).

[bash ] $ IFS=" 
" 
[bash ] $ for DEPENDENCY in `otool -L MyApplication | sed 1d` 
do 
    .... 
done 
0

usted puede hacerlo awk también. No hay necesidad de utilizar un golpe para el bucle

otool -L MyApplication | awk 'NR>1 
{ 
    # do your stuff here since awk process line by line. 
}' 
0

Usted tiene que usar orden interna del shell read, pero tenga cuidado con las líneas que contiene espacios y pestañas. Sugiero localmente valor de cambio de $IFS:

otool -L MyApplication | sed 1d | \ 
while IFS= read i; do 
    echo "line: " $i 
done 
Cuestiones relacionadas