======================================================================
#								     #
#                Author: iNo  // k0dsweb gr0up		             #
#          Статья является собственностью команды KODSWEB            #
#     Любое распространение без нашего ведома строго запрещено.      #
#			   -= 06.09.2006 =-			     #
#								     #
======================================================================
#								     #
#                             Shell-кодинг.                          #	
#								     #
======================================================================

###Intro...###

В данной статье я вкратце опишу shell-программирование,рассмотрю
простейшие примеры и прокомментирую их.Сразу оговорюсь,что эта
статья не является исчерпывающим руководством по shell-
программированию.Но её будет достаточно чтобы освоить его основы.
Несмотря на кажущуюся простоту shell-программирования,оно является 
достаточно мощным инструментом администратора unix-системы.Замечу,что
для полноценного администрирования unix-системы,уметь программировать
на shell просто необходимо.
Все примеры протестированы на системе Slackware Linux 10.2 и
полностью работоспособны.

###Общие положения.###

Комментарии начинаются с символа #,за исключением первой строки.
Первой строкой сценария является путь к интерпретатору,начинающийся 
с #! с помошью которого будет запущен данный скрипт.Например:

#!/bin/sh
#А вот это уже комментарий

###Переменные,ввод и вывод данных.###

Для задания переменных используется оператор присваевания "=".Синтаксис
следующий:

<переменная>=<значение>

Замечу,что в отличие от языков perl и php,между знаком "=" и остальными 
параметрами нельзя ставить пробел.В этом случае интерпретатор выдаст
ошибку.Чтобы обратится к заданной переменной ,надо вызвать её поставив 
перед ней знак $.Удалить переменную можно с помощью оператора unset.

Оператор Echo просто выводит строку(или переменную), идущую после него:

#!/bin/sh
var=Vasya
echo $var

>--------------------------------------<
Vasya
>--------------------------------------<

#!/bin/sh
echo My name is Vasya

>--------------------------------------<
My name is Vasya
>--------------------------------------<

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

#!/bin/sh
echo `My name is Vasya"

>--------------------------------------<
Error: My: command not found
>--------------------------------------<

#!/bin/sh
echo 'ls -a'

>--------------------------------------<
. .. .bash_history script.sh
>--------------------------------------<

Оператор read присваевает значение переменной.Вот пример,который 
просит ввести переменную var,считывает её а затем выводит.

#!/bin/sh
echo "Input var:"
read var
echo "The var is $var"

>--------------------------------------<
Input var:
123
The var is 123
>--------------------------------------<

###Агрументы командной строки.###

Как и во всех консольных программах, в shell-сценарий можно передавать
аргументы из командной строки.Переменные $1..$9 соответствуют параметрам,
переданным из командной строки сценарию.Переменная $0 содержит имя 
интерпретируемого файла.$#-содержит количество переданных аргументов.
$* и $@ содержат все аргументы,но в $@ все аргументы выделены кавычками.
Напишем скрипт,который выводит 2 аргумента командной строки и имя 
исполняемого файла.Запуск скрипта: ./script.sh 1 2

#!/bin/sh
echo "Name:$0"
echo "First argument:$1"
echo "Second argument:$2"

>--------------------------------------<
Name:./script.sh
First argument:1
Second argument:2
>--------------------------------------<

###Арифметические операции.###

Арифметические операции производятся с использованием оператора let.
Операции:

* - умножение
/ - деление
+ - сложение
- - вычитание
% - деление с остатком

Синтаксис:

let <значение> <оператор> <значение>

Пример:

#!/bin/sh
let res=2*7
echo $res

>--------------------------------------<
14
>--------------------------------------<

###Оператор test или [].###

Данные операторы предназначены для выполнения сравнений двух значений.
Если сравнение успешно-оператор возвращает 0,иначе 1.Код завершения 
последней выполненной команды хранится в специальной переменной $?.
Синтаксис:

test <значение> -опция <значение>

или

[<значение> -опция <значение>]

Пример:

#!/bin/sh
var=10
[ $var -eq 8 ]
echo $?

>--------------------------------------<
1
>--------------------------------------<

Ниже приведены все опции оператора test(или []):

Сравнение целых чисел:

-gt	больше чем
-lt	меньше чем
-ge	больше чем либо равно
-le	меньше чем либо равно
-eq	равно
-ne	не равно

Сравнение строк:

-z	проверка на наличие пустой строки
-n	проверка на наличие строки-значения
=	равенство
!=	неравенство
str	проверка на наличие строки,состоящей из нулей

Логические операции:

-a	И
-o	ИЛИ
!	НЕ

Проверка файлов:

-f	установка факта существования файла и его регулярности
-s	проверка,не является-ли файл пустым 
-r	проверка возможности считывания файла
-w	проверка возможности записи файла
-x	проверка исполняемости файла
-d	проверка,является-ли файл каталогом
-h	проверка,является-ли файл ссылкой
-c	проверка,является-ли файл байт-ориентированным устройством
-d	проверка,является-ли файл блок-ориентированным устройством

###Условия.###

Ниже описан синтаксис всех условных операторов,с примерами.

1)if <команда> then
<команда>
fi

Пример:

#!/bin/sh
if [ $1 -eq 10 ]; then
echo var=10
fi

Результат работы,при переданном параметре равном 10:

>--------------------------------------<
var=10
>--------------------------------------<

2)if <команда> then
<команда>
else
<команда>
fi

Пример:

#!/bin/sh
if [ $1 -eq 10 ]; then
echo var=10
else
echo var!=10
fi

Результат работы,при переданном параметре равном 10:

>--------------------------------------<
var=10
>--------------------------------------<

Результат работы,при переданном параметре равном 7:

>--------------------------------------<
var!=10
>--------------------------------------<


3)if <команда> then
<команда>
elif
<команда>
else
<команда>
fi

Пример:

#!/bin/sh
if [ $1 -eq 10 ]; then
echo var=10
elif [ $1 -eq 9 ]; then
echo var=9
else
echo var!=10 and var!=9
fi

Результат работы,при переданном параметре равном 10:

>--------------------------------------<
var=10
>--------------------------------------<

Результат работы,при переданном параметре равном 9:

>--------------------------------------<
var=9
>--------------------------------------<

Результат работы,при переданном параметре равном 8:

>--------------------------------------<
var!=10 and var!=9
>--------------------------------------<

4)case <строка> in
<шаблон>)
<команды>
;;
*)
<команды>
;;
esac

Case-конструкция позволяет выбирать один из нескольких альтернативных
вариантов.

#!/bin/sh
case $1 in
1)
echo arg is 1
;;
2)
echo arg is 2
;;
*)
echo arg is other
;;
esac

Результат работы,при переданном параметре равном 1:

>--------------------------------------<
arg is 1
>--------------------------------------<

Результат работы,при переданном параметре равном 2:

>--------------------------------------<
arg is 2
>--------------------------------------<

Результат работы,при переданном параметре равном 10:

>--------------------------------------<
arg is other
>--------------------------------------<

###Циклы.###

1)while <условие>
do
<команды>
done

Выполняет команды пока условие истино.

Пример:

#!/bin/sh
cont=yes
while [ $cont = yes ]
do
echo -n "continue?"
read cont
done

>--------------------------------------<
continue?
yes
continue?
no
>--------------------------------------<

2)until <условие>
do
<команды>
done

Выполняет команды пока условие ложно.

Пример:

#!/bin/sh
cont=yes
until [ $cont = no ]
do
echo -n "continue?"
read cont
done

>--------------------------------------<
continue?
yes
continue?
no
>--------------------------------------<

3)for <переменная>
do
<команды>
done

Выполняет команды для каждого параметра,который был передан
сценарию в командной строке.

Пример:

#!/bin/sh
for var
do
echo $var
done

Результат работы программы,с параметрами 1 2 3 4 5:

>--------------------------------------<
1
2
3
4
5
>--------------------------------------<

4)for <переменная> in <строка>
do
<команды>
done

Эта конструкция отличается от обычного for тем,что
параметры берутся не из командной строки,а из строки
после оператора in.

5)select <строка> in <перечень элементов>
do 
<команды>
done

Конструкция select создаёт меню на основе элементов заданного
списка,а затем выполняет для него указанную команду.

Пример:

#!/bin/sh
select var in 1 2 3
do
case $var in
1)
echo Number 1
;;
2)
echo Number 2
;;
3)
echo Number 3
;;
*)
echo Other
;;
esac
done


>--------------------------------------<
1) 1
2) 2
3) 3
#? 3
Number 3
#? _
>--------------------------------------<

МНЗ№1:редукторы и насосы