• Партнер

  • Юниксовый Bourne Shell (/bin/sh) является не только стандартным интерфейсом твоего пристанища на *nix, но и замечательным средством для программирования. С помощью sh-скриптов можно с лёгкостью решить сложнейшие задачи в несколько строк текста. Если ты работаешь под Win32, то порядок составления скриптов чем-то напоминает написание BAT файлов, но не копирует его. Многочисленные параметры значительно облегчают работу с составлением скриптов, в чём ты сам
    убедишься, прочитав эту статью. Здесь я изложу лишь азы, с помощью которых ты сможешь разбираться в чужих sh-скриптах и с успехом составлять свои.

    Итак, приступим.

    Как и в perl-скриптах, начало скрипта начинается с полного пути к интерпретатору, этот путь в нашем случае будет #!/bin/sh - путь к шелл-интерпретатору.

    Переменные

    В скрипте Shell можно использовать переменные. Самый простой способ присвоения значения переменной - написать следующее:

    perem=value

    При этом переменная perem получит значение value. Значением переменной можно воспользоваться в виде $perem. Чтобы отделить имя переменной от следующих символов, применяется
    ${perem}. Приятной особенностью Shell является то, что в переменную можно поместить вывод любой команды. Для этого используются обратные кавычки (``) и следующий формат:

    perem=`command`

    Например, чтобы поместить в архив все файлы, новее oldfile, используется команда:

    tar czf new.tgz `find . newer oldfile -print`

    Если строку завершить символом "амперсенд" (&), то Shell не будет ждать завершения команды, а отправит её в background (фоновый режим). Если же ты хочешь выполнить другой shell-скрипт в текущем, то просто вставь команду в скрипт:

    ./path/to/other/script

    В Shell содержатся встроенные переменные, которые значительно упрощают написание скриптов. Рассмотрим некоторые из них:

    $0 - название скрипта
    $1,$2,...,$n - параметры, переданные скрипту
    $# - число параметров, переданных скрипту
    $? - код возврата последнего процесса
    $$ - PID текущего процесса (PID - номер процесса в таблице процессов)
    $! - PID последнего процесса, запущенного в фоновом режиме
    $@ - список параметров, переданных скрипту
    $* - все параметры единой строкой

    Встроенные параметры значительно упрощают всю сложность задач. Пример: проверка существования пользователя $username в системе:

    #!/bin/sh
    grep $username /etc/passwd >/dev/null
    if [ $? -ne 0 ]
    then
    echo Пользователь не найден
    exit 1
    fi

    Как видно из скрипта, если переменная возвратила ненулевое значение, то пользователь был обнаружен.

    Перенаправление ввода/вывода

    Существует 3 стандартных файловых дескриптора: ввод, вывод и вывод ошибки (stdin, stdout, stderr), но Shell позволяет открывать и другие потоки вывода. Рассмотрим их:

    >file - перенаправление стандартного вывода (далее: stdout) в файл file
    >>file - перенаправление stdout для дозаписи в файл file
    <file - перенаправление стандартного ввода (далее: stdin) из файла file
    proc1|proc2 - перенаправление stdout процесса proc1 на stdin процесса proc2
    n>file - перенаправление дескриптора с номером n в файл file
    n>>file - то же с дозаписью
    n1>&n2 - слияние потоков с дескрипторами n1 и n2
    <<string - ввод до подстроки string ("Ввод здесь").

    Форму перенаправления "Ввод здесь" очень удобно использовать. Пример:

    mail -s "Hello" << TheEnd <message.txt
    root@localhost
    mail1@mail.ru
    mail2@mail.ru
    mail3@mail.ru
    TheEnd

    Условия.

    Для условия используется конструкция if..fi. Её формат такой:

    if условие
    then
    команда1
    .....
    командаN
    [elif условие
    ......]
    [else условие
    ......]
    fi

    Условие может быть любой командой, например

    if grep vasya /etc/passwd >/dev/null 2>&1 ;
    then echo Пользователь опознан ;
    fi

    Циклы

    Циклы в Shell бывают следующие: while, until и for.

    Цикл while выполняется, пока условие истинно, например:

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

    Цикл until - пока условие ложно. For - для всех элементов списка:

    for переменная in список
    do
    команды
    done

    Пример массовой рассылки (mess.txt) всех пользователей из файла user.txt, за исключением тех, кто есть в файле stop.txt:

    for user in `cat users.txt` do
    if grep $user stop.txt>/dev/null 2>&1
    then
    echo Skip $user
    else mail -s "Рассылка" $user <message.txt
    fi
    done

    Выбор.

    За выбором следит оператор case. Его использование:

    case значение in
    шаблон1)
    команды1
    ;;
    шаблон2)
    команды2
    ;;
    ....
    *)
    команды
    ;;
    esac

    Шаблоны могут включать в себя выражения, содержащие *, ? и [abc]. Иногда это бывает очень полезно.

    Вот и всё. Это общая информация по Shell скриптам. Другие возможности желаешь? man sh or RTFM.

    Удачи в программировании.

    Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии