Shell скрипты

В данной статье я вкратце опишу 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. Операции:


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

Синтаксис арифметических операций в Shell:


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


Пример sh let:


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

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

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

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

Синтаксис оператора test:


        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

Пример условия if ... then:


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

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


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


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

Пример if ... then ... else:


        #!/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

Пример if ... then ... elif ... else:


        #!/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

Оператор языка shell-программирования while выполняет команды, пока условие истино.
Пример:


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

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


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

Оператор until выполняет команды, пока условие ложно.
Пример:


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

        >--------------------------------------<

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


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

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


        #!/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
        #? _
        >--------------------------------------<