Shell-coding: программируем в *nix-консоли

Xakep, номер #038, стр. 038-033-1

Автор: SHuRuP

Когда сидишь в консоли (а все мы с этим сталкиваемся), невольно хочется оптимизировать/упростить работу в ней. Как это сделать? Многие посоветуют учить С/С++, но зачем напрягаться больше, если есть способ проще?

У всех *nix-систем (современных) обязательно есть несколько командных интерпретаторов, вот самые известные из них:

Bourne Shell aka /bin/sh - именно он и будет рассматриваться в этой статье (инициализация - .profile);

Bourne-Again Shell aka /bin/bash - идентичен Bourne Shell (.profile и .bashrc);

C Shell aka /bin/csh - интерпретатор для C-программеров (.login и .cshrc).

Написание скриптов на Bourne Shell

Выполнение скриптов на sh равносильно набиранию всех этих команд с консоли. Все программы должны начинаться с:

#!/bin/sh

Комментарии начинаются с помощью символа '#'. Значения переменным задаются так:

var1=value

var1 - переменная, value - значение этой переменной. Дальше следует использовать данную переменную с символом '$' в начале ($var1). Существуют также другие возможности получения переменной:

${var1}text - отделяет значение $var1 от последующего текста (text);

${var1:=var2} - если значение $var1 не определено, то ей присваивается значение $var2;

${var1:-var2} - если значение $var1 не определено, то выводится значение $var2 ($var1 остается не определенным).

Пример простого скрипта:

#!/bin/sh

#script 1

var1=text1

var2=text2

echo ${var1}klm

#выведет text1klm

echo ${var1:=$var2}

#выведет text1

echo ${var4:=$var2}

#выведет text2

echo ${var4:-$var1}

#выведет text2

Некоторые переменные, используемые sh:

$$ - pid текущего shell'а;

$! - pid последнего процесса в фоновом режиме;

$? - код возврата последнего процесса;

$x - где x-числа: параметры, переданные скрипту ($0 - последний запущенный скрипт).

#!/bin/sh

#script 2

echo "script filename: $0"

#выведет название файла данного скрипта

echo "value1: $1"

#выведет первый параметр, заданный скрипту

echo "value2: $2"

#выведет второй параметр, заданный скрипту

Параметры скрипту задаются так:

/home/shurup/script1 value1 value2 value3

value1, value2, value3 - параметры для скрипта.

В Bourne Shell также возможно создание условий:

if [ условие ]

then действия при выполнении условия

else действия при невыполнении условия

fi

Пример использования:

#!/bin/sh

#script 3

if [ $1 == $2 ]

then echo "$1 равно $2"

else echo "$1 не равно $2"

fi

Циклы в sh создаются так:

while команда1

do

действие1

done

Действие1 будет исполняться до конца выполнения команды1.

Пример использования:

#!/bin/sh

#script 4

while :

do

echo test

done

В случае запуска этого скрипта команда 'echo test' будет выполняться в бесконечном цикле.

Для считывания информации в sh используется команда 'read'. Еще один пример использования циклов со считыванием информации:

#!/bin/sh

#script 5

cat ./sh_script5.txt | grep text1 |

while read text

do

if [ $text == "text1" ]

then echo "text1 был успешно найден в файле sh_script5.txt"

else echo "text1 не был найден в файле sh_script5.txt"

fi

done

Этот скрипт надо запускать из одного каталога с файлом sh_script5.txt. Файл sh_script5.txt выглядит примерно так:

text7

text45

Содержание  Вперед на стр. 038-033-2

Выпуски журнала "Xakep"
Журнал Хакер. Содержание номера #001Журнал Хакер. Содержание номера #002Журнал Хакер. Содержание номера #003Журнал Хакер. Содержание номера #004Журнал Хакер. Содержание номера #005Журнал Хакер. Содержание номера #006Журнал Хакер. Содержание номера #007Журнал Хакер. Содержание номера #008Журнал Хакер. Содержание номера #009Журнал Хакер. Содержание номера #010Журнал Хакер. Содержание номера #011Журнал Хакер. Содержание номера #012Журнал Хакер. Содержание номера #013Журнал Хакер. Содержание номера #014Журнал Хакер. Содержание номера #015Журнал Хакер. Содержание номера #016Журнал Хакер. Содержание номера #017Журнал Хакер. Содержание номера #018Журнал Хакер. Содержание номера #019Журнал Хакер. Содержание номера #020Журнал Хакер. Содержание номера #021Журнал Хакер. Содержание номера #022Журнал Хакер. Содержание номера #023Журнал Хакер. Содержание номера #024Журнал Хакер. Содержание номера #025Журнал Хакер. Содержание номера #026Журнал Хакер. Содержание номера #027Журнал Хакер. Содержание номера #028Журнал Хакер. Содержание номера #029Журнал Хакер. Содержание номера #030Журнал Хакер. Содержание номера #031Журнал Хакер. Содержание номера #032Журнал Хакер. Содержание номера #033Журнал Хакер. Содержание номера #034Журнал Хакер. Содержание номера #035Журнал Хакер. Содержание номера #036Журнал Хакер. Содержание номера #037Журнал Хакер. Содержание номера #038Журнал Хакер. Содержание номера #039Журнал Хакер. Содержание номера #040Журнал Хакер. Содержание номера #041Журнал Хакер. Содержание номера #042Журнал Хакер. Содержание номера #043Журнал Хакер. Содержание номера #044Журнал Хакер. Содержание номера #045Журнал Хакер. Содержание номера #046Журнал Хакер. Содержание номера #047Журнал Хакер. Содержание номера #048Журнал Хакер. Содержание номера #049Журнал Хакер. Содержание номера #050Журнал Хакер. Содержание номера #051Журнал Хакер. Содержание номера #052Журнал Хакер. Содержание номера #053Журнал Хакер. Содержание номера #054Журнал Хакер. Содержание номера #055Журнал Хакер. Содержание номера #056Журнал Хакер. Содержание номера #057Журнал Хакер. Содержание номера #058Журнал Хакер. Содержание номера #059Журнал Хакер. Содержание номера #060Журнал Хакер. Содержание номера #061Журнал Хакер. Содержание номера #062Журнал Хакер. Содержание номера #063Журнал Хакер. Содержание номера #064Журнал Хакер. Содержание номера #065Журнал Хакер. Содержание номера #066Журнал Хакер. Содержание номера #067Журнал Хакер. Содержание номера #068Журнал Хакер. Содержание номера #069Журнал Хакер. Содержание номера #070Журнал Хакер. Содержание номера #071Журнал Хакер. Содержание номера #072Журнал Хакер. Содержание номера #073Журнал Хакер. Содержание номера #074Журнал Хакер. Содержание номера #075Журнал Хакер. Содержание номера #076Журнал Хакер. Содержание номера #077Журнал Хакер. Содержание номера #078Журнал Хакер. Содержание номера #079Журнал Хакер. Содержание номера #080Журнал Хакер. Содержание номера #081Журнал Хакер. Содержание номера #082Журнал Хакер. Содержание номера #083Журнал Хакер. Содержание номера #084Журнал Хакер. Содержание номера #085Журнал Хакер. Содержание номера #086Журнал Хакер. Содержание номера #087Журнал Хакер. Содержание номера #088Журнал Хакер. Содержание номера #089Журнал Хакер. Содержание номера #090Журнал Хакер. Содержание номера #091Журнал Хакер. Содержание номера #092Журнал Хакер. Содержание номера #093Журнал Хакер. Содержание номера #094Журнал Хакер. Содержание номера #095Журнал Хакер. Содержание номера #096Журнал Хакер. Содержание номера #097Журнал Хакер. Содержание номера #098Журнал Хакер. Содержание номера #099Журнал Хакер. Содержание номера #100Журнал Хакер. Содержание номера #101Журнал Хакер. Содержание номера #102Журнал Хакер. Содержание номера #103Журнал Хакер. Содержание номера #104Журнал Хакер. Содержание номера #105Журнал Хакер. Содержание номера #106Журнал Хакер. Содержание номера #107Журнал Хакер. Содержание номера #108Журнал Хакер. Содержание номера #109Журнал Хакер. Содержание номера #110Журнал Хакер. Содержание номера #111Журнал Хакер. Содержание номера #112Журнал Хакер. Содержание номера #113Журнал Хакер. Содержание номера #114