Как вы обрабатываете вывод команды в командной строке по строкам?

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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