Язык оболочки

Язык оболочки является разновидностью языка программирования (он похож на язык командных файлов MS DOS). Программы, написанные на языке оболочки, оформляются в виде текстовых исполняемых файлов, называемых файлами скриптов. Пример простого скрипта:

# Пример простого скрипта

date

who

ls

Пусть имя данного файла - mycom. Для его выполнения необходимо осуществить следующие шаги:

1. Сделать его исполняемым: $chmod u+x mycom

2. Выполнить его: $mycom

Файл скрипта может выполнить не обязательно оболочка, загруженная по умолчанию, но и любая другая. Для этого в файле необходимо указать комментарий специального вида, начинающийся с '#!'. Например, следующий скрипт будет выполнен оболочкой sh:

#! /bin/sh

date

who

ls

На рис. 1 представлены основные компоненты языка оболочки.

 

1. Переменные окружения (или стандартные переменные оболочки):

PATH - каталоги, разделенные символом ':', в которых оболочка ищет команды;

PWD - текущий рабочий каталог;

TERM - тип терминала;

SHELL - имя пути для оболочки по умолчанию;

Вывод всех переменных окружения: $set или $printenv

Вывод указанной переменной окружения: $echo $SHELL

Установка значения для переменной окружения: %set TERM=vt100 (без пробелов!)

Экспорт переменной окружения: $EDITOR=emacs

$export EDITOR или $export EDITOR=emacs

2. Переменные, определенные пользователем (или именованные переменные)

Пример присвоения значения именованной переменной count: count=10 (без пробелов!)

Для ссылки на значение переменной в программе перед ее именем указывается $, например:

$echo $count

3. Позиционные параметры (доступны только для чтения) принимают значения аргументов из командной строки. Их имена: $0 $1 $2 … $9.

4. Специальные переменные оболочки:

$? - код завершения последней выполненной команды;

$# - число аргументов в командной строке при запуске данной команды;

$$ - идентификатор процесса оболочки;

$! - идентификатор последнего фонового процесса, запущенного в оболочке.

5. Функции ввода-вывода: echo - функция вывода; read - функция ввода.

Задание 4.

4.1. Напишите простую программу script1 на языке оболочки, которая:

· печатает имя и выводит содержимое текущего каталога;

· выводит код завершения последней команды (команды ls);

· экспортирует переменную окружения SERVER_NAME и задает ей значение "intel.com";

· выводит сообщение End of program.

Сделайте файл script1 исполняемым, затем выполните команду $script1

Поясните результат. Как следует ввести команду для запуска script1 из Вашего каталога? Приведите два варианта: а) с указанием абсолютного пути; б) с указанием относительного пути.

4.2. Включите Ваш каталог lab1 в PATH: $PATH=$PATH:$HOME/lab1 Запишите в отчет значение переменной окружения PATH. Выполните еще раз команду $script1

4.3. Linux, как и UNIX, традиционно хранит исполняемые файлы в каталогах bin. Создайте в Вашем каталоге подкаталог bin и скопируйте в него script1. Запустите script1 из bin.

Задание 5. Наберите в каталоге lab1 и выполните следующие скрипты. Запишите в отчет текст каждого примера и полученные результаты с пояснениями.

script2 #Печать позиционных параметров

echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9

Можно ли вывести параметры с номерами больше 9?

script3#Печать позиционных параметров

echo Всего $# параметров: $*

Работает ли данный пример, если число параметров в командной строке больше 9?

script4echo Введите имя и фамилию

read name surname

echo $name $surname, Вы ввели $# параметров:

echo $*

6. Арифметические операции над целыми числами выполняются при помощи команды expr. Пример (используются обратные кавычки!):

#Сложить и вывести два позиционных параметра

sum=`expr $1 + $2`

echo $sum

7. Оператор if и команда test. В следующем примере set `date` запускает команду date и присваивает ее результаты позиционным параметрам. Первым параметром является день недели.

set `date`

if test $1 = Mon

then

echo "Сегодня начало недели"

else

echo "Сегодня другой день"

fi

8. Циклы (команды for, while, loop)

Задание 6. Выполните следующие примеры. В примере 6.1 параметры в командной строке должны быть целыми числами. Запишите в отчет текст каждого примера и полученные результаты с пояснениями.

script5 #Печать значений позиционных параметров, деленных на два

for number in $*

do

half=`expr number / 2`

echo $number $half

done

 

script6#Печать позиционных параметров 5 раз

count=5

while test $count -gt 0

do

echo $*

count=`expr $count - 1`

done

 

script7 #Печать позиционных параметров 5 раз

count=5

until test $count -eq 0

do

echo $*

count=`expr $count - 1`

done

Задание 7. Разработать скрипт rmfile, предназначенный для "безопасного" (с подтверждением) удаления файла. Скрипт запускается командой $rmfile имя_файла. Скрипт

1) проверяет, является ли параметр командной строки именем файла. В операторе if используйте команду

test -f $<переменная_позиц.параметр№1>

2) если параметр не является файлом, то выводит соответствующее сообщение;

3) если параметр является файлом, то спрашивает, действительно ли пользователь желает удалить файл имя_файла; если да, то удаляет файл и сообщает, что файл удален; усли нет, то печатает соответствующее сообщение.

Запишите в отчет текст файла rmfile.