The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Bash-программирование (shell howto)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: shell, howto,  (найти похожие документы)
From: Докучаев Дмитрий <forb@k-uralsk.ru> Subject: Bash-программирование http://kamensk.net.ru/forb/info/linux/programm/bash.html Bash-программирование _________________________________________________________________ Юниксовый 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 позволяет открывать и другие потоки вывода. Рассмотрим их: &ltfile - перенаправление стандартного вывода (далее: 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 ;; .... *) команды ;; ecas Шаблоны могут включать в себя выражения, содержащие *, ? и [abc]. Иногда это бывает очень полезно. Вот и всё. Это общая информация по Shell скриптам. Другие возможности желаешь? man sh or RTFM. http://kamensk.net.ru/forb/

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ RSS ]
  • 1, BigShadow (?), 12:06, 22/03/2006 [ответить]  
  • +/
    "$@ - список параметров, переданных скрипту
    $* - все параметры единой строкой"
    типа одно и тоже? ;)
    =======
    "Встроенные параметры значительно упрощают всю сложность задач." - сложнопостигаемо, но блестяще закручено :)))
    =======
    "Существует 3 стандартных файловых дескриптора: ввод, вывод и вывод ошибки" - на самом деле дескриптор это число, т.е. существуют стандартные потоки в/в "ввод, вывод и вывод ошибки", которым соответствуют дескрипторы 0, 1 и 2.
    =======
    "<<file - перенаправление stdout для дозаписи в файл file" - если правильно, то будет так:
    >>file
    =======
    ">>string - ввод до подстроки string 'Ввод здесь'" - если правильно, то будет так:
    <<string
    =======
    Пример:
    mail -s "Hello" >> TheEnd >message.txt
    root@localhost
    mail1@mail.ru
    mail2@mail.ru
    mail3@mail.ru

    TheEnd
    ВООБЩЕ ВРЕДИТЕЛЬСКИЙ :-о !!!
    =======
    Пример:
    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
    ВООБЩЕ ДИВЕРСИЯ ПРОТИВ СОЗНАНИЯ :(((
    ошибки + крайне нерациональное решение
    =======

     
  • 3, bot (?), 14:29, 28/05/2006 [ответить]  
  • +/
    Может не туда запостил, но все равно думаю кому-то очень облегчит жизнь Делалос... большой текст свёрнут, показать
     

    игнорирование участников | лог модерирования

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру