2010-06-24 15 views

risposta

23

È necessario utilizzare il comando read.

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

Vedi bashref per una descrizione del incorporato read, e le sue opzioni. Puoi anche dare un'occhiata al seguente tutorial per esempi di utilizzo di read insieme a for.

+7

Attenzione: se è necessario impostare le variabili nel ciclo while (cioè memorizzare quello che hai trovato in uscita di otool), faranno svaniscono non appena l'uscita dal ciclo perché fa parte di una pipeline e quindi viene eseguito in una subshell. In bash, puoi aggirare questo con un po 'di riorganizzazione: 'mentre leggi i; do ... done <<(otool -L MyApplication | sed 1d) ' –

+1

Un altro avvertimento: cancellerà un sacco di spazi e backslash. Usa 'read -r i' per leggere le righe senza tali modifiche. – Jens

+0

@Jens, no, è il comando eco che mangia spazi. 'echo" line: $ i "' lo impedirà. –

0

È possibile utilizzare awk per elaborare le cose su una base per linea. Esattamente quello che è il modo migliore dipende da quello che stai cercando di fare però.

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

Provare a cambiare il separatore di campo interno in una nuova riga. Per impostazione predefinita, bash sta per separare i token da spazi quando si utilizza un ciclo for. L'impostazione IFS farà in modo che il ciclo for divida i token in base a qualunque stringa IFS sia uguale a (dividendo quindi i token elenco di newline invece di token per spazi).

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

si può fare awk pure. Non c'è bisogno di utilizzare un ciclo for bash

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

Devi usare shell builtin read, ma attenzione con linee che contiene spazi e tabulazioni. Suggerisco localmente modificare il valore di $IFS:

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