2010-06-24 6 views
16

Мне нужно обработать общие библиотеки библиотеки из сценария bash. for командные процессы слово за словом:Как вы обрабатываете вывод команды в командной строке по строкам?

for DEPENDENCY in `otool -L MyApplication | sed 1d` 
do 
    ... 
done 

Какой способ обработки результатов строку за строкой?

ответ

23

Вы должны использовать команду read.

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

См bashref для описания чтения и встроенных команд, его параметры. Вы также можете ознакомиться со следующими tutorial примерами использования read в сочетании с for.

+7

Внимание: если вам необходимо установить переменные в цикле While (т.е. сохранить то, что вы нашли в выходе otool в), они исчезают, как только цикл завершается, потому что это часть конвейера и, следовательно, работает в подоболочке. В bash вы можете обойти это с небольшим перераспределением: 'while read i; do ... done <<(otool -L MyApplication | sed 1d) ' –

+1

Другое предупреждение: Это удалит много пробелов и обратных косых черт. Используйте 'read -r i' для чтения строк без таких изменений. – Jens

+0

@Jens, нет, это команда эхо-еды. строка 'echo ': $ i" "предотвратит это. –

0

Вы можете использовать awk, чтобы обрабатывать вещи по отдельности. Точно, какой лучший способ зависит от того, что вы пытаетесь сделать, хотя.

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

Попробуйте изменить внутренний разделитель полей на новую строку. По умолчанию bash будет разделять токены пробелами при использовании цикла for. Ваш IFS-параметр заставит for-цикл разделять маркеры на основе любой строчной IFS, равной (таким образом, разбивая токены списка на новые строки вместо токенов пробелами).

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

вы можете сделать это awk также. Нет необходимости использовать Баш цикл

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

Вы должны использовать встроенную команду оболочки read, но будьте осторожны с линиями, содержащие пробелы и табуляции. Я предлагаю локально изменить значение $IFS:

otool -L MyApplication | sed 1d | \ 
while IFS= read i; do 
    echo "line: " $i 
done 
Смежные вопросы