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