|
"Кодим в Bash!" Гребенников Роман ака voy Xakep, номер #055, стр. 055-064-2 #!/bin/sh var1='Мама мыла раму' var2='раму' var3='пол' echo `echo $var1 | sed s/$var2/$var3/` # заменяем слово "раму" на "пол" echo $var1 и $var3 # добавляем к исходной строке третью строку Я думаю, тут все понятно, кроме двух вещей: команды sed и кучи апострофов. Sed - подпрограмма Bash для работы с текстом на лету, т.е. она перехватывает весь вывод и делает с ним какие-нибудь преобразования, а потом отправляет его в stdout. В данном случае мы из 'echo $var1' выхватывали первое слово 'раму' и заменяли его словом 'пол'. У sed существует куча возможностей, если хочешь узнать о них подробнее, набери 'info sed'. Обрати внимание на апострофы: в пятой строчке они обратные. Это позволяет просто выполнить какую-либо команду и спихнуть все, что она наговорила, как параметр в какую-нибудь другую команду. [Полезное: убивалка] Так, теперь пора навалять что-нибудь более полезное. Давай разберем маленькую программку, убивающую все процессы с именем, которое ей дали как параметр, т.е. запустили 'killps xmms', где killps - наша с тобой программка, а xmms - та группа процессов, которые мы хотим убить. #!/bin/sh USER=`whoami` # сшибаем только свои процессы PARAM=$@ # запихиваем в эту переменную все параметры запуска if test "$param" = ""; then # если нет параметра, то вываливаемся с ошибкой echo Ты что-то забыл... exit 0 fi # завершение конструкции if-then for num in `ps -u $USER|grep $PARAM|cut -b 1-6`; do echo убиваю $num.... kill $num done # завершение цикла Не мешало бы разобрать самую длинную строку нашей программулины. Ну 'for ... done' - это цикл, об этом любой догадается. А вот остальное - это самое интересное: три команды, разделенные знаком |, позволяют вывод первой затолкать во вторую, а, соответственно, вывод второй - в третью. Эта возможность часто используется в такого рода скриптах, чтобы не заводить кучу временных переменных. Команда 'ps -u <user>', я думаю, тебе частично знакома, можешь поиграться с ней в консоли, ничего страшного в ней нет. А вот cut вряд ли тебе известна. Эта штуковина может вырезать разные подстроки из данной строки. В нашем случае мы схватили первые 6 байт, т.е. pid. Программка получилась очень даже полезная при убивании тяжелых монстров, типа гнома или кде, в случае их зависания или простого надоедания. [Полезное: скриншоты] Помнишь, в начале статьи я что-то наплел про работу Bash c x-win? Так вот, шелестеть иксами действительно можно, но только с использованием кое-каких библиотек. Давай разберем примерчик, который всего лишь делает скриншот root-window и засовывает полученное в какой-нибудь файл. Удобно забиндить для этой команды какую-нибудь кнопочку и не мучиться с монстроподобным гимпом каждый раз, когда тебе нужен скриншот. Для работы этого скрипта нужен пакет программ ImageMagick, наверняка он у тебя установлен. Из этого пакета нам потребуется всего одна программка import, так что если она у тебя есть, весь набор можно не качать. Но вернемся к нашему скрипту: #!/bin/sh SCRDIR=screens ok=0 num=0 if [ ! -d $HOME/$SCRDIR ]; then # если нет папки screens, |