Как читать строки из переменной | bash

for arg in 123 234 345; do 
    foo -bar "$arg" --baz=quux &
done

В качестве альтернативы:

echo 123 234 345 | xargs -P3 -n1 -J% foo -bar % --baz=quux
1
06.12.2016, 05:59
3 ответа

В этом случае не следует вызывать grep . Все можно сделать только с помощью вашей оболочки. Например,

while read -r line; do [[ $line =~ INPUT.*ACCEPT ]] && printf '%s\n' "$line"; done < your_iptables_file
0
27.01.2020, 23:34

Вот когда здесь вступает в силу строка :

while read line; do
...
done<<<$INPUT_file 
0
27.01.2020, 23:34

Вам лучше использовать подстановку процесса, а не переменную:

while read line; do
....
done < <(grep -E 'INPUT.*ACCEPT' $FILE)

(обратите внимание на два символа <). Это позволяет избежать загрузки всего вывода grep в память сразу для хранения в переменной. Процесс grep будет выполняться параллельно с циклом, и цикл будет видеть вывод grep как вход read по мере распечатки каждой строки (вплоть до буферизации).

Это, как правило, быстрее и использует меньше памяти, чем использование подстановки команды $(...) и сохранение всего вывода. Это также обычно лучший стиль, если вы пишете скрипт, специфичный для Bash, потому что он явно указывает, для чего вы используете команду.


Возможно, это немного антипаттерн для начала - возможно, вам лучше использовать обычный конвейер для любой обработки, которая вам требуется, а не while read ... и обрабатывать его в Bash, но есть обоснованные случаи для использования и того, и другого.

2
27.01.2020, 23:34

Теги

Похожие вопросы