## 8. Немного Программирования

## 8.1. Скрипты shell: .BAT файлы, объевшиеся стероидов

Если Вы использовали .BAT файлы, чтобы создать сокращения для длинных командных строк (я писал их множество), то в Linux это можно сделать вставкой соответствующих alias строк (см. пример выше) в `profile` или `.profile`. Но если ваши .BAT-файлы были более сложными, тогда вам понравится язык создания сценариев, предоставляемый shell: он также мощен как QBasic, если не больше. Он имеет переменные, структуры типа while, for, case, if... then... else, и множество других возможностей: он может быть хорошей альтернативой "настоящему" языку программирования.

Чтобы написать скрипт --- эквивалент .BAT файла под DOS --- все, что Вы должны сделать - это написать стандартный ASCII-файл, содержащий команды, сохранить его, затем сделать его выполнимой программой с помощью команды `chmod +x <scriptfile>`. Для запуска напечатайте его имя.

Предупреждение. Системный редактор называется `vi`, и, по моему опыту, новички находят его очень трудным для использовании. Я не собираюсь объяснять, как им пользоваться, потому что мне он не нравится, и я не пользуюсь им. Так что могу рассказать про него следующее:

- Чтобы вставить текст, напечатайте "`i`", затем ваш текст;
- Чтобы удалить символы, напечатайте <ESC> затем "`x`";
- Чтобы выйти из `vi` без сохранения, напечатайте <ESC> затем `:q!`
- Сохранить и выйти, напечататйте <ESC> затем `:wq`.

Хороший редактор для новичка - `joe`: вызовите его, напечатав `jstar`, и вы получите очень знакомый по DOS редактор. `Jed` в WordStar или IDE режиме даже лучше. Пожалуйста, обратитесь к разделу "Где найти приложения", чтобы узнать, где можно найти эти редакторы.

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

      #!/bin/sh

      # sample.sh

      # Это комментарий

      # не изменяйте первую строку, она необходима

      echo "Это система: `uname -a`" # использование вывода команды

      echo "Мое имя $0" # встроенная переменная

      echo "Вы передали мне $# параметров: "$*

      echo "Первый параметр: "$1

      echo -n "Как ваше имя? " ; считывание вашего имени

      echo notice the difference: "Здорово, $your_name" # использование "

      echo notice the difference: 'Здорово $your_name' # использование '

      DIRS=0 ; FILES=0

      for file in `ls .` ; do

        if [ -d ${file} ] ; then # если файл является каталогом

          DIRS=`expr $DIRS + 1`  # DIRS = DIRS + 1

        elif [ -f ${file} ] ; then

          FILES=`expr $FILES + 1`

        fi

        case ${file} in

          *.gif|*jpg) echo "${file}: графический файл" ;;

          *.txt|*.tex) echo "${file}: текствый файл" ;;

          *.c|*.f|*.for) echo "${file}: файл исходного текста" ;;

          *) echo "${file}: некий файл" ;;

        esac

      done

      echo "насчитано ${DIRS} каталогов и ${FILES} файлов"

      ls | grep "ZxY--!!!WKW"

      if [ $? != 0 ] ; then # код выхода последней выполненной команды

        echo "ZxY--!!!WKW не найден"

      fi

      echo "хватит... введите 'man bash', если вам нужно больше информации

## 8.2. C для Вас

В UNIX системный язык - C, вызывающий или любовь, или ненависть. Также доступны и множество других языков (Java, ФОРТРАН, Паскаль, Lisp, BASIC, Perl, awk ...).

В предположении, что в знаете C, имеется пара руководящих принципов для тех из Вас, кто испорчен Турбо C++ или одном из компиляторов DOS. Транслятор С в Linux называется gcc и испытывает недостаток всех звоночков и свистков, которые обычно сопровождают его DOSовских собратьев: никаких IDE, интерактивных справок, интегрированных отладчиков, и т.д. Это всего лишь грубый транслятор командной строки, очень мощный и эффективный. Чтобы скомпилировать ваш стандартный `hello.c`, выполните:

> `

>            $ gcc hello.c

> `

который создаст исполняемый файл, называемый a.out. Чтобы дать выполнимой программе другое имя,

> `

>            $ gcc -o hola hello.c

> `

Чтобы подсоединить библиотеку к программе, добавьте ключ `-l <libname>`. Например, чтобы подсоединить математическую библиотеку:

> `

>           $ gcc -o mathprog mathprog.c -lm

> `

(ключ `-l <libname>`; указывает gcc присоединить библиотеку `/usr/lib/lib<libname>`; .a; так -lm связан с `/usr/lib/libm.a`).

Идем дальше. Пока все хорошо. Но если ваш `prog` состоит из нескольких исходных файлов, то вы должны будете использовать утилиту make. Давайте предположим, что Вы написали синтаксический анализатор выражения: исходный файл называется `parser.c` и #includes два файла заголовков `parser.h` и `xy.h`. Затем Вы хотите использовать подпрограммы в `parser.c` в программе, скажем, `calc.c`, который в свою очередь #includes `parser.h`. Что за бардак! Что Вы должны сделать, чтобы скомпилировать `calc.c`?

Вам надо будет написать так называемый `makefile`, который обучает транслятор зависимости между исходниками и объектными файлами. В нашем примере:

      # this is makefile, used to compile calc.c

      # Press the <TAB> key where indicated!

      calc: calc.o parser.o

      <TAB>gcc -o calc calc.o parser.o -lm

      # calc depends on two object files: calc.o and parser.o

      calc.o: calc.c parser.h

      <TAB>gcc -c calc.c

      # calc.o depends on two source files

      parser.o:  parser.c parser.h xy.h

      <TAB>gcc -c parser.c

      # parser.o depends on three source files

      # end of makefile.

Сохраните этот файл как `Makefile`, и напечатайте `make`, чтобы скомпилировать вашу программу; альтернативно, сохраните его как `calc.mak`, и напечатайте, `make -f calc.mak`, и, конечно, RMP. Вы можете вызывать некоторые справки о функциях C, которые документированы в 3 разделе man страниц; например,

> `

>            $ man 3 printf

> `

Для отладки ваших программ используйте `gdb`. Используйте `info gdb` чтобы узнать, как им пользоваться.

Имеется большое количество доступных библиотек; самая первая из них, которую вы захотите использовать - ncurses, обрабатывающая текстовые режимы экрана, и `svgalib`, работающая с графикой. Если Вы достаточно храбры, чтобы заняться программированием под X11, то имеются библиотеки типа вышеупомянутох `XForms`, `Qt`, `Gtk` и многих других, которые облегчают написание программ под X11. Посмотрите в `http://www.xnet.com/~blatura/linapp6.html` .

Многие редакторы могут действовать как IDE; `emacs` и `jed`, например, также обеспечивают подсветку синтаксиса, автоматические отступы и так далее. Альтернативно, воспользуйтесь пакетом `rhide` из `ftp://sunsite.unc.edu:/pub/Linux/devel/debuggers/`. Это - аналог Borland IDE, и возможно, что вам он понравится.