Обработка строк циклом «for line in `comand`»

Если у вас какая-то команда возвращает список строк, например:




$ cat list.txt 
шишка
яблоко
листок
груша 




То с помощью цикла for line in `comand` можно обработать этот вывод построчно.








Например такой скрипт:




#!/bin/bash
for line in `cat list.txt`
do
   echo "На дереве висит $line"
done 




Выполним его:




$ ./test.sh 
На дереве висит шишка
На дереве висит яблоко
На дереве висит листок
На дереве висит груша




Или более сложная задача, вывести все процессы пользователя и выяснить сколько файлов они открыли, а также сколько файлов им позволено открывать.




#!/bin/bash
for pid in `ps -u alex -o pid | grep -v PID`
do
   ps -p $pid -o comm,user | grep -v COMMAND
   egrep 'files|Limit' /proc/$pid/limits
   echo "Currently open files: $(ls -1 /proc/$pid/fd | wc -l)"
done




Вывод данного скрипта у меня очень большой, поэтому оставлю выборочные процессы:




$ ./test.sh 
Thunar
Limit                     Soft Limit           Hard Limit           Units     
Max open files            1024                 1048576              files     
Currently open files: 21
skypeforlinux
Limit                     Soft Limit           Hard Limit           Units     
Max open files            8192                 1048576              files     
Currently open files: 108
anydesk
Limit                     Soft Limit           Hard Limit           Units     
Max open files            1024                 1048576              files     
Currently open files: 50
TeamViewer.exe Limit      Soft Limit           Hard Limit           Units     
Max open files            4096                 4096                 files     
Currently open files: 72
chrome
Limit                     Soft Limit           Hard Limit           Units     
Max open files            8192                 1048576              files     
Currently open files: 53




Видно что файловый менеджер Thunar у меня открыл 21 файл из 1024 разрешенных, один из нескольких процессов Skype открыл 108 файлов из 8192, приложения для удаленного доступа Anydesk и TeamViewer открыли 50 и 72 файлов, а один из многих процессов Chrome открыл 53 файла.




Также для подобной задачи подходит другой цикл «while read line», о нём я писал в этой статье.








Спасибо за внимание!



2021-01-13T12:00:00
Программирование на Bash