LR3


Чтобы посмотреть этот PDF файл с форматированием и разметкой, скачайте его и откройте на своем компьютере.
1


Лабораторная

работа


3
«
BASH
:
П
ОТОКИ

ДАННЫХ
.
П
РОГРАММИРОВАНИЕ
»

Часть

1.
Потоки

ввода

и

вывода

данных

Потоки

и

файлы

Логически все файлы в системе
Linux

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

Эта логическая организация файлов распространяется на операции ввода и вывода.
Данные в операциях ввода и вывода организованы аналогично файлам. Данные, вводимые
с клавиатуры, направляются в поток данных, орга
низованный как непрерывная
совокупность байтов. Данные, выводимые из команды или программы, также направляются
в поток, организованный как непрерывная совокупность байтов. Входной поток данных в
ОС
Linux

называется стандартным вводом, а выходной поток данн
ых
-
стандартным
выводом.

Поскольку стандартный ввод и стандартный вывод организованы так же, как файл,
они свободно могут взаимодействовать с файлами. В ОС
Linux

широко используется
переадресация, которая позволяет перемещать данные в файлы и из файлов.

Пе
реадресация

стандартного

вывода
: �
и

��

Когда выполняется команда ОС
Linux
,
дающая какую
-
либо выходную информацию,
эта информация направляется в поток данных стандартного вывода. По умолчанию в
качестве пункта назначения данных стандартного вывода использу
ется какое
-
либо
устройство, в данном случае экран. Устройства, такие как клавиатура и экран, тоже
рассматриваются как файлы. Они принимают и отправляют потоки байтов, имеющих такую
же организацию, как и файлы байтового потока. Экран
-

это устройство, на ко
тором
отображается непрерывный поток байтов. По умолчанию стандартный вывод посылает
свои данные на экран, где они отображаются.

Для

направления
стандартного
вывода
в
файл,

а
не
на
экран, необходимо

использовать оператор переадресации
вывода: >. С помощью операции переадресации
создается новый файл
-
адресат. Если он уже существует, то система заменит его
содержимое данными стандартного вывода. Для того чтобы этого не произошло, можно
установить для
shell
режим
noclobber:


-
o

noclobber

В этом случае операция переадресации существующего файла выполнена не будет.
Отменить режим
noclobber

можно, поставив после оператора переадресации
восклицательный знак:

cat

file
�1 !
file
2

Хотя оператор переадресации и имя файла ставятся после команды,
пе
ренаправление стандартного потока выполняется не после выполнения команды, а до
него. С помощью оператора переадресации создается файл и переадресация организуется
до того, как начинают поступать данные со стандартного вывода. Если файл уже
2


существует, он

будет разрушен и заменен новым файлом под тем же именем. Команда,

генерирующая выходные данные, выполняется только после

создания файла
переадресации.

Если пользователь попытается использовать одно и то же имя для входного файла
команды и переадресованного

файла, возникнет ошибка. Так как операция переадресации
выполняется первой, входной файл, поскольку он существует, разрушается и заменяется
файлом с тем же именем. Когда команда начинает выполняться, она обнаруживает пустой
входной файл. Для добавления ст
андартного вывода к существующему файлу служит
оператор переадресации >>.

Переадресация

стандартного

ввода
:
и



Многие команды ОС
Linux

могут принимать данные со стандартного ввода. Сам
стандартный ввод получает данные из устройства или из файла. По умо
лчанию в качестве
устройства для стандартного ввода используется клавиатура. Символы, набираемые на
клавиатуре, подаются на стандартный ввод, который затем направляется в команду.

Во многих
Linux
-
системах применяется метод буферизации строк. При буферизаци
и
строк, информация посылается на стандартный ввод только после того, как пользователь
ввел всю строку.

Стандартный ввод можно переадресовать так же, как и стандартный вывод.

Стандартный ввод может приниматься не с клавиатуры, а из файла. Оператор

переадре
сации
стандартного ввода: <.

Кроме
этого
для
переадресации
стандартного

ввода
применяется механизм "файл здесь":

cat
'
слово
-
признак

конца

ввода
'



'
текст
'



'
текст
'



'
слово
-
признак

конца

ввода
'

Операции переадресации стандартного ввода и стандартно
го вывода можно
объединять.

Переадресация

и

пересылка

по

каналу

стандартного

потока
ошибок
: �&, 2�.

При выполнении команд иногда происходят ошибки. Например, пользователь указал
неверное количество аргументов или возникла какая
-
то системная ошибка. Когда в
озникает
ошибка, система выдает специальное сообщение. Как правило, такие сообщения об
ошибках отображаются на экране вместе со стандартным выводом. ОС
Linux
,
однако,
различает стандартный вывод и сообщения об ошибках. Сообщения об ошибках
помещаются еще в

один стандартный байтовый поток, который называется стандартным
потоком ошибок (диагностики).

Так как сообщения об ошибках направляются в поток, отдельный от стандартного
вывода, то в случае переадресации стандартного вывода в файл они все равно появляютс
я
на экране.

Стандартный поток ошибок можно переадресовать так же, как и стандартный вывод.
Например, сообщения об ошибках можно сохранить в файле для справок. Как и в случае
стандартного вывода, пунктом назначения стандартного потока ошибок по умолчанию
я
вляется экран, однако с помощью специальных операторов переадресации его можно
переадресовать в любой файл или устройство.

Для переадресации стандартного потока ошибок в
shell

предусмотрена специальная
возможность. Все стандартные байтовые потоки в операци
ях переадресации можно
обозначать номерами (дескрипторами). Номера 0, 1 и 2 обозначают соответственно
стандартный ввод, стандартный вывод и стандартный поток ошибок. Оператор
переадресации
вывода, >,
по
умолчанию
действует
на
стандартный
выво
д,
1.
Чтобы

3


п
ереадресовать стандартный поток ошибок, нужно поставить перед оператором
переадресации вывода цифру 2.

Стандартный поток ошибок можно дописать в файл, используя цифру 2 и оператор
добавления: >>. Для того чтобы переадресовать и стандартный

вывод, и стандартный поток
ошибок, нужны две операции переадресации и два файла.

В
BASH

можно ссылаться на стандартный поток по его номеру со знаком "&": &1
обозначает стандартный вывод. Это обозначение можно использовать в операции
переадресации для того
, чтобы сделать стандартный вывод файлом назначения. Операция
переадресации 2>&1 переадресует стандартный поток ошибок на стандартный вывод. В
результате стандартный вывод становится файлом назначения для стандартного потока
ошибок. Операция переадресации
1>&2 переадресует стандартный ввод в стандартный
поток ошибок. По умолчанию входным потоком операции

>& является стандартный поток
ошибок, а выходным потоком
-

стандартный вывод. Поэтому, если его
использовать

в
команде, все сообщения о ошибках будут перен
аправляться на стандартный вывод.

Программные

каналы
: |

Иногда возникают ситуации, когда нужно передать данные из одной команды в
другую. Другими словами, необходимо послать стандартный вывод одной команды на
стандартный ввод другой, а не в файл. Для образ
ования такого соединения в ОС
Linux

используется так называемый канал. Оператор канала, | (вертикальная черта), помещенный
между двумя командами, связывает их стандартные потоки. Стандартный вывод одной
команды становится стандартным вводом другой. Выходна
я информация команды,
стоящей перед оператором канала, передается в качестве входной в команду, стоящую за
оператором канала.

Программные каналы можно объединять с другими средствами
shell
,
например со
специальными символами, проводя таким образом специали
зированные операции.

Если операция переадресации позволяет просто направлять выходную информацию
в файл, то каналы обеспечивают ее пересылку в другую команду
Linux
.
Следует помнить о
различии между файлом и командой. Файл
-

это носитель данных. Вы можете х
ранить или
читать из него данные. Команда
-

это программа, которая исполняет инструкции. Команда
может читать данные из файла и сохранять данные в файле, но во время выполнения ее
нельзя рассматривать как файл. По этой причине операция переадресации выполн
яется с
файлами, а не с командами. В процессе переадресации данные посылаются из программы в
файл, а не в другую программу. Пунктом назначения операции переадресации могут быть
только файлы, но не программы.

Можно, тем не менее, смоделировать процесс конве
йерной пересылки с помощью
нескольких операций переадресации. Выходная информация одной команды посылается в
файл. Команда, записанная в следующей строке, использует этот файл как
переадресованный ввод.

Каналы работают со стандартным выводом команды незави
симо от того, что
подается на этот вывод. Пересылаться по каналу из одной команды в другую может
содержимое целого файла и даже нескольких файлов.

Стандартным вводом, посылаемым по каналу в команду, можно более эффективно
управлять с помощью аргумента стан
дартного ввода,
-
. Дефис, используемый в команде в
качестве аргумента, обозначает стандартный ввод.

Допустим, нужно напечатать файл с именем его каталога в начале списка. Команда
pwd

выдает имя каталога, а команда
cat

выдает содержимое файла. В данном случ
ае
команде
cat

нужно использовать в качестве входной информации и файл, и стандартный
ввод, пересланный по каналу из команды
pwd
.
Команда
cat

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

pwd

|
cat

-

f
ile

|
lpr

4


Каналы

и

переадресация
:
команда

tee

Для того, чтобы переадресовать стандартный вывод в файл и одновременно
воспроизвести эту информацию на экране

необходимо использовать команду
tee
.
Команда
tee

копирует стандартный вывод в файл. В качестве аргум
ента она использует имя нового
файла, в который копируется стандартный вывод. Это все равно что скопировать
содержимое стандартного вывода и один его экземпляр переадресовать в файл, а другой
отправить дальше (часто
-

на экран).

Переадресацией в сочетании
с каналами необходимо пользоваться осторожно.

Переадресация стандартного вывода задает файл назначения для него. Стандартный

вывод записывается и сохраняется в этом файле. После записи никакой информации для

пересылки по каналу в другую команду не остается
. Переадресация может производиться

в

конце

последовательности

программных

каналов,

но

не

внутри

этой

последовательности.

Часть

2.
Программирование

в

BASH
-
shell

Shell

Командный интерпретатор в среде
UNIX

выполняет две основные функции:

-

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

-

обрабатывает

и

исполняет

текстовые

файлы,

содержащие

команды
интерпретатора
(командные файлы);

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

Существует несколько типов оболочек в мире
UNIX
.
Две главные
-

это ``
Bourne

shell
''
и ``C
shell
'.
Bourne

s
hell

(или просто
shell
)
использует командный синтаксис, похожий
на первоначально для
UNIX
.
В большинстве
UNIX
-
систем
Bourne

shell

имеет имя /
bin
/
sh

(где
sh

сокращение от ``
shell
'').
C

shell

использует иной синтаксис, чем
-
то напоминающий
синтаксис языка про
граммирования Си. В большинстве
UNIX
-
систем он имеет имя /
bin
/
csh
.

В
Linux

есть несколько вариаций этих оболочек. Две наиболее часто используемые,
это Новый
Bourne

shell

(
Bourne

Again

Shell
)
или
``
Bash
'' (/
bin
/
bash
)
и
Tcsh

(/
bin
/
tcsh
).
Bash

-

это развитие
прежнего
shell

с добавлением многих полезных возможностей, частично
содержащихся в C
shell
.

Поскольку
Bash

можно рассматривать как надмножество синтаксиса прежнего
shell
,
любая программа, написанная на
sh

shell

должна работать и в
Bash
.
Tcsh

является
расши
ренной версией C
shell
.
При входе в систему пользователю загружается командный
интерпретатор по умолчанию. Информация о том, какой интерпретатор использовать для
конкретного пользователя находится в файле /
/
passwd
.

Возможно, вам захочется выполнить сцен
арий, написанный для одного из
shell

Linux
,
в то время как вы работаете в другом. Предположим, вы работаете в
TCSH
-
shell

и
хотите выполнить написанный в
BASH

сценарий, содержащий команды этого (второго)
shell
.
Сначала нужно с помощью команды
sh

перейти в
B
ASH
-
shell
,
выполнить сценарий, а
затем вернуться в
TCSH
.
Эту процедуру можно автоматизировать, поставив первыми в
сценарии символы #! и указав после них путевое имя программы нужного
shell

в вашей
системе.
Shell

всегда изучает первые символы сценария и на
их основании делает вывод о
том, к какому типу
shell

этот сценарий относится
-

BASH
,
PDKSH

или
TCSH
.
Если первый
символ
-

пробел, это сценарий
BASH
-
shell

или
PDKSH
-
shell
.
Если первый символ
-

знак #,
это сценарий
TCSH
-
shell
.
Если первые символы
-

#!, то
sh
ell

читает указанное за ними имя
программы. После символов #! всегда должно следовать путевое имя программы нужного

shell
,
по которому можно идентифицировать его тип. Если вы запускаете сценарий из
shell
,
отличного от того, который указан в первой строке з
апускаемого сценария, то будет вызван
5


shell
,
указанный в первой строке, и в нем выполнится ваш сценарий. В такой ситуации
одного пробела или знака 41 для указания того, что это сценарий
BASH

или
TCSH
,
бывает
недостаточно. Такая идентификация работает тольк
о в собственных сценариях этих
shell
.
Чтобы обозначить сценарий другого
shell
,
необходимо поставить символы #! и путевое
имя.Например, если поставить в начало первой строки сценария
hello

комбинацию
символов #!/bin/sh, то этот сценарий можно будет выполнят
ь непосредственно из
TCSH
-
shell
.
Сначала сценарий осуществит переход в
BASH
,
выполнит его команды, а затем
вернется в
TCSH

(или в тот
shell
,
из которого он выполнялся). В следующем примере
сценарий
hello

содержит команду #!/bin/sh. Пользователь выполняет с
ценарий, находясь в
TCSH
-
shell
.

Командные

файлы

Командный файл в
Unix

представляет собой обычный текстовый файл,
содержащий
набор команд
Unix

и команд
Shell
.
Для того чтобы командный интерпретатор
воспринимал
этот текстовый файл, как командный необходимо у
становить атрибут на исполнение.

$
echo


ps
-
af


� commandfile
$ chmod +x commandfile $
./commandfile

В представленном примере команда
echo


ps

-
af
” >
commandfile

создаст файл с одной
строкой “
ps

-
af

“,
команда
chmod

+
x

commandfile

установит атрибут на
исполнение
для
этого файла, команда ./
commandfile

осуществит запуск этого файла.

Переменные

shell

Имя
shell
-
переменной
-

это начинающаяся с буквы последовательность букв, цифр и
подчеркиваний. Значение
shell
-
переменной
-

строка символов.

Например
:
Var

=

String


или

Var

=
String

Команда
echo

$
Var

выведет на экран содержимое переменной
Var

т.е. строку „
String

,
на то что мы выводим содержимое переменной указывает символ „$‟. Так команда
echo

Var

выведет на экран просто строку „
Var
‟ .

Еще один вариант
присвоения значения переменной
Var

=
` набор команд
Unix

`
Обратные кавычки говорят о том, что сначала должна быть выполнена заключенная в них
команда), а результат ее выполнения, вместо выдачи на стандартный выход, приписывается
в качестве значения переме
нной.

CurrentDate

= `
date
`

Переменной
CurrentDate

будет присвоен результат выполнения команды
date
.
Можно присвоить значение переменной и с помощью команды "
read
",
которая
обеспечивает прием значения переменной с (клавиатуры) дисплея в диалоговом режиме.

e
cho

“Введите

число”

read

X
1

echo

“вы

ввели

-


$
X
1

Несмотря на то, что
shell
-
переменные в общем случае воспринимаются как строки,
т. е. "35"
-

это не число, а строка из двух символов "3" и "5", в ряде случаев они могут
интерпретироваться иначе, например, ка
к целые числа.

Разнообразные возможности имеет команда "
expr
".

x
=7

y
=2

rez=
`
e
xpr

$x + $
y
`

echo

результат=$
rez

6


выдаст на экран результат=9

Параметры

командного

файла

В командный файл могут быть переданы параметры. В
shell

используются
позиционные параметры
(т.е. существенна очередность их следования). В командном файле
соответствующие параметрам переменные (аналогично
shell
-
переменным) начинаются с
символа "$", а далее следует одна из цифр от 0 до 9: При обращении к параметрам перед
цифрой ставится символ до
ллара "$" (как и при обращении к переменным):

$0
соответствует имени данного командного файла;

$1
первый по порядку параметр;

$2
второй параметр и т.д.

Поскольку число переменных, в которые могут передаваться параметры, ограничено
одной цифрой, т.е. 9
-
ю ("
0", как уже отмечалось имеет особый смысл), то для передачи
большего числа параметров используется специальная команда "
shift
".

Команда "
"
устанавливает значения параметров. Это бывает очень удобно.
Например, команда "
date
"
выдает на экран текущую дату,

скажем, "
Mon

May

01 12:15:10
2002",
состоящую из пяти слов, тогда

`
date
`

e
cho

$1 $3 $5
выдаст на экран
Mon

01 2002


Программные

структуры

Как во всяком процедурном языке программирования в языке
shell

есть операторы.
Ряд операторов позволяет управлять

последовательностью выполнения команд. В таких
операторах часто необходима проверка условия, которая и определяет направление
продолжения вычислений.

Команда

test

Команда
test

проверяет выполнение некоторого условия. С использованием этой
(встроенной) ком
анды формируются операторы выбора и цикла языка
shell
.
Два возможных
формата команды:

test

условие

или

[
условие

]

В
shell

используются условия различных "типов".
Условия проверки файлов:

-
f

file

файл "
file
"
является обычным файлом;
-
d

file

файл "
file
"
-

к
аталог;
-
с

file

файл "
file
"
-

специальный файл;
-
r

file

Имеется разрешение на чтение файла "
file
";
-
w

file

Имеется разрешение на запись в файл "
file
";

7


-
s

file

файл "
file
"
не пустой.
Условия проверки строк:

str
1 =
str
2

строки "
str
1"
и "
str
2"
совпадают;
str
1

!=
str
2

строки "
str
1"
и "
str
2"
не совпадают;
-
n

str
1

строка "
str
1"
существует (непустая);

-
z

str
1

строка "
str
1"
не существует (пустая).
Условия сравнения целых чисел:

x
-
eq

y

"
x
"
равно "
y
",
x

-
ne

y

"
x
"
неравно "
y
",
x

-
gt

y

"
x
"
больше "
y
",
x

-
ge

y

"
x
"
боль
ше или равно "
y
",
x

-
lt

y

"
x
"
меньше "
y
",
x

-
le

y

"
x
"
меньше или равно "
y
".

То есть в данном случае команда "
test
"
воспринимает строки символов как целые (!)
числа. Поэтому во всех остальных случаях "нулевому" значению соответствует пустая
строка. В данном

же случае, если надо обнулить переменную, скажем, "x", то это
достигается присваиванием "x=0". Сложные условия реализуются с помощью типовых
логических операций:

!
(
not
)
инвертирует значение кода завершения.

-
o

(
or
)
соответствует логическому "ИЛИ".

-
a

(
an
d
)
соответствует логическому "И"

Управляющие

структуры

С помощью управляющих структур пользователь может осуществлять контроль над
выполнением
Linux
-
команд в программе. Управляющие структуры позволяют повторять
команды и выбирать для выполнения команды, не
обходимые в конкретной ситуации.
Управляющая структура состоит из двух компонентов: операции проверки и команд. Если
проверка считается успешной, то выполняются команды. Таким образом, с помощью
управляющих структур можно принимать решения о том, какие ком
анды следует
выполнять.

Существует два вида управляющих структур: циклы и условия. Цикл используется
для повторения команд, тогда как условие обеспечивает выполнение команды при

соблюдении
8


некоторых критериев. В
BASH
-
shell

используются три вида циклических

управляющих
структур
(
while
,
for

и
for
-
in
)
и две условные управляющие структуры
(
if

и
case
).

Управляющие структуры
while

и i
f

-

это структуры общего назначения. Они
используются, например, для выполнения итераций и принятия решений на основании
различных
проверок. Управляющие структуры
case

и
for

-

более специализированные.
Структура
case

представляет собой модифицированную форму условия
if

и часто
используется для построения меню. Структура
for

-

это цикл ограниченного типа. Здесь
обрабатывается список зн
ачений, и на каждой итерации цикла переменной присваивается
новое значение.

В управляющих структурах
if

и
while

проверка построена на выполнении
Linux
-
команды. Все команды ОС
Linux

после выполнения выдают код завершения. Если команда
выполнена нормально, в
ыдается код 0. Если по какой
-
либо причине команда не
выполняется, то выдается положительное число, обозначающее тип отказа. Управляющие
структуры
if

и
while

проверяют код завершения
Linux
-
команды. Если код
-

0, выполняются
действия одного типа, если нет
-

другого.

Дополнительная

информация

Во
-
первых, обязательно обратитесь к
man

bash
.

Во
-
вторых, краткая памятка по командам, которые вам могут понадобиться:

pwd

Вывести текущую директорию.
hostname

Вывести или изменить сетевое имя машины.
whoami

Ввести имя под

которым я зарегистрирован.

date

Вывести или изменить дату и время. Например, чтобы установить дату и время
равную 2000
-
12
-
31 23:57, следует выполнить команду:
date

123123572000

time

Получить информацию о време
ни, нужного для выполнения процесса + еще кое
-
какую информацию. Не путайте эту команду с
date
.
Например: Я могу определить как много
времени

много времени требуется для вывода списка файлов в директории, набрав
последовательность:

time

ls

who

Определить кт
о из пользователей работает на машине.

rwho


a

Определение всех пользователей, подключившихся к вашей сети. Для выполнения
этой команды требуется, чтобы был запущен процесс
rwho
.
Если такого нет
-

запустите

"
"
под суперпользователем.

finger

[
имя
_пользователя]

Системная информация о зарегистрированном пользователе. Попробуйте:
finger

root

uptime

9


Количество времени прошедшего с последней перезагрузки.

ps


a

Список текущих процессов.

top

Интерактивный список текущих процессов отсортированных по испо
льзованию
cpu
.

uname

Вывести системную информацию.
free

Вывести информацию по памяти.

df


h

(=
место
на диске) Вывести информацию о свободном и используемом месте на
дисках (в читабельном виде).

du

/
-
bh

|
more

(=
кто
сколько занял) Вывод детальной информаци
и о размере файлов по
директориям
начиная с корневой (в читабельном виде).

cat

/
proc
/
cpuinfo

Системная информация о процессоре. Заметьте, что файла в
/
proc

директории
-

не
настоящие файлы. Они используются для получения информации, известной системе.

cat

/
proc
/
interrupts

Используемые прерывания.
cat

/
proc
/
version

Версия ядра
Linux

и другая информация
cat

/
proc
/
filesystems

Вывести используемые в данный момент типы файловых систем.

cat

/
/
printcap

Вывести настройки принтера.

lsmod

(
как
root
)
Вывести информа
цию о загруженных в
данный момент модулях ядра.


|
more

Вывести текущие значения переменных окружения.

echo

$
PATH

Вывести

значение переменной окружения
"
PATH
"
Эта

команда

может

использоваться для вывода значений других переменных окружения. Воспользуйте
сь
командой
,
для получения полного списка.

grep


Поиск вхождения регулярного выражения в строки заданного файла (потока).

10


Задание

для

выполнения

1.

Вывести любое сообщение с помощью команды
echo

перенаправив вывод:

-

в несуществующий файл с помощью симво
ла >;

-

в несуществующий файл с помощью символа >>;

-

в существующий файл с помощью символа >;

-

в существующий файл с помощью символа >>;
Объяснить результаты.

2.

Переадресовать стандартный ввод для команды
cat

на файл.

3.

Вывести сообщение с помощью команды
ec
ho

в канал ошибок. Создать

файл

myscript:

#!/bin/sh echo
stdout
echo
stderr�&2
exit
0

Запустить его:

-

без перенаправления
(sh myscript);

-

перенаправив стандартный вывод в файл, просмотреть содержимое файла
(
sh

myscript


file
1);

-

перенаправить стандартный кан
ал ошибок в существующий и несуществующий
файлы с помощью символов > и >> (а тут и дальше уже сами :) );

-

перенаправив стандартный вывод в файл 1, стандартный канал ошибок
-

в файл 2;

-

перенаправив стандартный вывод и стандартный канал ошибок в файл 3;

-

перен
аправив стандартный вывод в файл 4 с помощью символа >, а стандартный
канал ошибок в файл 4 с помощью символа >>;

Объяснить результаты.

4.

Вывести третью строку из последних десяти строк отсортированного в обратном

порядке файла
/
etc
/
group
.

5.

Подсчитать при
помощи конвейера команд количество блочных устройств ввода
-
вывода, доступных в системе.

6.

Написать скрипт, выводящий на консоль все аргументы командной строки,
переданные данному скрипту. Привести различные варианты запуска данного скрипта, в
том числе без н
епосредственного вызова интерпретатора в командной строке.

7.

Написать скрипт согласно индивидуальному заданию. Номер варианта

согласовать с преподавателем.

Варианты

индивидуальных

заданий

1.
Написать командный файл, реализующий меню из трех пунктов: 1
-
ый п
ункт
-

ввести пользователя и вывести на экран все процессы, запущенные данным

пользователем;
2
-
ой пункт
-

показать всех пользователей, в настоящий момент,

находящихся в системе; 3
-
ий пункт


заверение.

2.
Написать командный файл, реализующий меню из трех пу
нктов: 1
-
ый пункт
-
вывести всех пользователей, в настоящее время, работающих в системе; 2
-
ой пункт


послать сообщение пользователю, имя пользователя, терминал и сообщение вводятся с
клавиатуры; 3
-
ий пункт


заверение.

3.
Написать командный файл, реализующи
й меню из трех пунктов: 1
-
ый пункт
-
показать все процессы пользователя, запустившего данный командный файл; 2
-
ой пункт


послать сигнал завершения процессу текущего пользователя

(ввести
PID

процесса); 3
-
ий
пункт


заверение.

4.
Написать командный файл, посы
лающий сигнал завершения процессам текущего
11


пользователя. Символьная маска имени процесса вводится с клавиатуры.

5.
Написать командный файл подсчитывающий количество определенных процессов
пользователя (Ввести имя пользователя и название процесса)

6.
Реализо
вать Меню из двух пунктов: 1
-
ый пункт


определить количество
запущенных данным пользователем процессов
bash

(предусмотреть ввод имени
пользователя); 2
-
ой пункт


завершить все процессы
bash

данного пользователя.

7.
Реализовать Меню из трех пунктов: 1
-
ый пу
нкт поиск файла в каталоге <Имя
файла> и <Имя каталога> вводятся пользователем; 2
-
ой пункт


копирование одного файла
в другой каталог
-

<Имя файла> и <Имя каталога> вводятся; 3
-
ий пункт


завершение
командного файла.

8.
Написать командный файл который в ци
кле по нажатию клавиши выводит
информацию о системе, активных пользователях в системе, а для введенного имени
пользователя выводит список активных процессов данного пользователя.

9.
Реализовать командный файл который при старте выводит информацию о

системе,

информацию о пользователе, запустившем данный командный файл, далее в

цикле выводит список
активных
пользователей в системе


запрашивает

имя

пользователя

и

выводят

список

всех

процессов

bash

запущенных данным

п
ользователем.

10.
Реализовать командный файл,

позволяющий в цикле посылать всем активным
пользователям сообщение


сообщение вводится с клавиатуры. Командный файл при старте
выводит имя компьютера, имя запустившего командный файл пользователя, тип
операционной системы,
IP
-
адрес машины.

11.
Реализовать

командный файл, позволяющий в цикле посылать всем активным
пользователям (исключая пользователя, запустившего данный командный файл)
сообщение


сообщение вводится с клавиатуры. Командный файл при старте выводит имя
компьютера, имя запустившего командный
файл пользователя, тип операционной системы,
список загруженных модулей.

12.
Реализовать командный файл который при старте выводит информацию о
системе, информацию о пользователе, запустившем данный командный файл, далее в цикле
выводит список активных поль
зователей в системе


запрашивает имя пользователя
и
выводят список всех терминалов, на которых зарегистрирован
этот пользователь.

13.
Реализовать командный файл, который выводит: дату, информацию о системе,
текущий каталог, текущего пользователя, настрой
ки домашнего каталога текущего
пользователя, далее в цикле выводит список активных пользователей


запрашивает имя
пользователя и выводит информацию об активности данного пользователя.

14.
Реализовать командный файл, который выводит: дату в формате день


м
есяц


год


время, информацию о системе в формате: имя компьютера: версия ОС:
IP

адрес: имя
текущего пользователя: текущий каталог, Выводит настройки домашнего каталога
текущего пользователя и основные переменные окружения. Далее в цикле выводит список
ак
тивных пользователей


запрашивает имя пользователя и выводит информацию об
активности введенного пользователя.

15.
Реализовать командный файл, реализующий символьное меню

(в цикле)

1

Пункт: Вывод полной информации о файлах каталога: Ввести имя каталога для

отображения

2

Пункт изменить атрибуты файла: файл вводится с клавиатуры по запросу
,
атрибуты, которые требуются установить тоже вводятся. После изменения атрибутов

вывести на экран расширенный список файлов для проверки установленных атрибутов

3

Выход

При

старте командный файл выводит информацию об имени компьютера,
IP
-
адреса
и список всех пользователей

зарегистрированных в данный момент на компьютере.

16.
Реализовать командный файл, реализующий символьное меню

(
в цикле)

1

Пункт: Вывод полной информации о фай
лах каталога: Ввести имя каталога для
отображения

12


2

Пункт создать командный файл: файл вводится с клавиатуры по запросу, далее
изменяются атрибут файла на исполнение, затем вводится с клавиатуры строка которую
будет исполнять командный файл. После изменения
атрибутов вывести на экран
расширенный список файлов для проверки установленных атрибутов и запустить
созданный командный файл.

3

Выход

При старте командный файл выводит информацию об имени компьютера,
IP
-
адреса,
и список всех пользователей зарегистрирован
ных в данный момент на компьютере.

17.
Написать командный файл реализующий символьное меню

1

Пункт: работа с информационными командами

(реализовать все основные

информационные команды)

2

Пункт: Копирование файлов: в этом пункте выводится информация о

содерж
имом текущего каталога, далее предлагается интерфейс копирования файла: ввод

имени файла и ввод каталога для копирования. По выполнению пункта выводится

содержимое каталога, куда был скопирован файл и выводится содержимое

скопированного файла.

3

Пункт: Вых
од

18.

Написать скрипт с использованием цикла
for
,
выводящий на консоль размеры и
права доступа для всех файлов

в заданном каталоге и всех его подкаталогах (имя
каталога
задается пользователем в качестве первого аргумента
командной строки).

19.

Написать скрипт,
находящий в заданном каталоге и всех его подкаталогах все
файлы, владельцем которых является заданный пользователь. Имя владельца и каталог
задаются пользователем в качестве первого и второго аргумента командной строки. Скрипт
выводит результаты в файл (тр
етий аргумент командной строки) в виде полный
путь, имя
файла, его размер. На консоль выводится общее число просмотренных файлов.

20.

Написать скрипт поиска одинаковых по их содержимому файлов в двух

каталогах, например,
Dir
1
и
Dir
2.
Пользователь зада
ё
т им
ена
Dir
1
и
Dir
2
в качестве

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

в
Dir
1,
сравниваются с файлами в
Dir
2
по их содержимому. На экран выводятся число

просмотренных файлов и результаты сравнения.

Отчет

О
тчет по прод
еланной работе представляется преподавателю в стандартной форме:
на листах формата А4, с титульным листом (включающим тему, фио, номер зачетки и пр.),
целью, ходом работы и выводами по выполненной работе. Каждое задание должно быть
отражено в отчете следую
щим
образом: 1) что надо было сделать, 2) как это сделали, 3) что
получилось, и, в зависимости
от задания


4) почему получилось именно так, а не иначе.
При наличии заданий с вариантами необходимо указать свой вариант, и расчет его номера,
а также вс
ё
выше
указанное для данного варианта задания.




Приложение

1 «
Примеры скриптов bash.
»


1)
Сценарий "Всем привет"

П
ервый пример bash
-
скрипта:

#!/bin/bash

echo "Hello World"

Создаем файл
hello
_
world
.
sh
, записываем в него текст скрипта и делаем его исполня
емым:

$ chmod +x hello_world.sh

Запускаем скрипт на выполнение

13


$ ./hello_world.sh

Hello

World





2)
Работа с переменными

В данном примере
происходит

объявл
ение

прост
ой

переменн
ой

и вывод

её на экран с
помощью команды echo. Меняем

содержимое

файла

hello_world.sh
на
:



#!/bin/bash

STRING="HELLO WORLD!!!"

echo $STRING



Запускаем
:

$ ./hello_world.sh

HELLO

WORLD
!!!





3)
Передаем аргументы в скрипт

Создаем файл
arguments
.
sh

с кодом



#!/bin/bash

# Используйте предопределенные переменные для доступа к аргументам

# Вы
водим аргументы на экран

echo $1 $2 $3 '
-
� echo $1 $2 $3'

echo $1'
-
� echo $3 $2 $1'

# Используйте переменную [email protected] для вывода всех аргументов сразу

echo [email protected] '
-
� echo [email protected]'

#Используйте переменную $# для вывода количества переданный в скрипт
аргументов

echo Ко
личество аргументов: $# '
-
� echo Number of arguments passed: $#'



и не забываем сделать его исполняемым

$ chmod +x hello_world.sh



Запускаем
:

$ ./
arguments
.
sh

Привет! Скрипт Вася

Привет! Скрипт Вася
-

echo

$1 $2 $3

Вася Скрипт Привет!
-

echo

$3 $2 $1

Привет! Скрипт Вася
-

echo

[email protected]

Количество аргументов: 3

-

echo

Количество аргументов: $#



4)
Выполнение в скрипте команд оболочки

Создаем файл
bash
_
backtricks
.
sh



#!/bin/bash

# используйте обратные кавычки " ` ` " для выполнения команды оболочки

echo `
uname
-
o`

# теперь попробуем без кавычек

echo uname
-
o



14


Запускаем:

$
uname

-
o

GNU
/
Linux

$ ./
bash
_
backtricks
.
sh

GNU/Linux

uname
-
o

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



5)
Читаем пользовательский ввод (интерактив
ность)

Создаем файл read.sh



#!/bin/bash

echo
-
e "
Хай
!
Пожалуйста наберите слово:
\
c "

read

word

echo "Введенное слово: $word"

echo
-
e "Можете ввести два слова? "

read word1 word2

echo "Вот ваши слова:
\
"$word1
\
"
\
"$word2
\
""

echo
-
e "Как вы чувствуете се
бя программируя на bash? "

# Теперь команда read сохраняет ваш ответ в стандартной, встроенной переменной
$REPLY

read

echo "Вы сказали $REPLY, Я рад это слышать! "

echo
-
e "Какие цвета вам нравятся? "

# параметр
-
a дает комманду считывать данные в массив

r
ead
-
a colours

echo "Мои любимыее цвета ${colours[0]}, ${colours[1]} and ${colours[2]}:
-
)"



Запускаем:

$ ./read.sh

Хай! Пожалуйста наберите любое слово: слово

Введенное слово: слово

Можете ввести два слова?

Debian Linux

Вот ваши слова: "Debian" "Linux"

Ка
к вы чувствуете себя программируя на
bash
?

good

Вы сказали
good
, Я рад это слышать!

Какие цвета вам нравятся?


blue green black

Мои

любимые

цвета

blue, green and black

:
-
)



6)
Использование ловушки

Создаем файл
trap
.
sh



#!/
bin
/
bash

# объявляем ловушку

trap

bashtrap

INT

# очищаем экран

clear
;

# функция ловушки выполняется, когда пользователь нажимает
CTRL
-
C
:

15


# На экран будет выводиться => Вы нажали CTRL+C!... Это бесполезно!


# но скрипт будет продолжать выполняться

bashtrap()

{


echo "Вы нажали CTRL+
C!... Это бесполезно!"

}

#
скрипт

будет

считать

до

10

for a in `seq 1 10`; do



echo "$a/10 to Exit."




sleep 1;

done

echo "
Все

закончилось
!
Конец примера."



Запустив файл на исполнение пробуем прервать его выполнение сочетанием клавиш
CTRL
+
C

$ ./
tra
p
.
sh

1/10

2/10

3/10

4/10

5/10

6/10

CTRL
+
C

Вы нажали
CTRL
+
C
!... Это бесполезно!

7/10

8/10

9/10

CTRL+C Вы нажали CTRL+C!... Это бесполезно!

10/10

Все закончилось! Конец примера.

Как видим, сочетание клавишь Ctrl
-
C не остановило выполнение скрипта.





7)
Усл
овия "если
-
то
-
иначе"

Создаем файл
if
_
else
.
sh
.

Обратите внимание на пробелы в квадратных скобках, без которых условие работать не
будет.



#!/bin/bash

directory="./BashScripting"

# проверяем наличие директории

if

[
-
d

$
directory

];
then



echo

"Каталог су
ществует"

else



echo

"Каталог не существует"

fi



Запускаем:

$ ./
if
_
else
.
sh

Каталог не существует

$ mkdir BashScripting

$ ./if_else.sh

16


Каталог

существует



8)
Сравнения

8.1)
Арифметические сравнения

Для сравнения чисел используются следующие операторы:

-
lt

вместо




-
gt

вместо




-
le

вместо


=

-
ge

вместо


�=

-
eq

вместо


==

-
ne

вместо


!=

Создаем файл
equals
.
sh
:



#!/bin/bash

# Объявляем переменные с целочисленными значениями

NUM1=2

NUM2=2

if [ $NUM1
-
eq $NUM2 ]; then



echo "Значения равны"

else




echo "Значения не равны"

fi



Запускаем:

$ ./
equals
.
sh

Значения равны



Меняем содержимое файла на:



#!/
bin
/
bash

# Объявляем переменные с целочисленными значениями

NUM
1=2

NUM
2=3

if

[ $
NUM
1
-
eq

$
NUM
2 ];
then



echo

"Значения равны"

else




echo

"Значения не равны"

fi



Запускаем:

$ ./
equals
.
sh

Значения не равны



Следующий пример:



#!/
bin
/
bash

# Объявляем переменные с целочисленными значениями

NUM
1=2

NUM
2=1

if

[ $
NUM
1
-
eq

$
NUM
2 ];
then



echo

"Значения равны"

17


elif

[ $
NUM
1
-
gt

$
NUM
2 ];
then



echo

"$
NUM
1 больше чем $
NUM
2"

else




echo

"$
NUM
2 больше чем $
NUM
1"

fi



Запускаем:

$ ./
equals
.
sh

2 больше чем 1



8.2)
Символьно
-
текстовые сравнения

Для сравнения строк и символьных переменных

в

bash

используются следующие
операторы:



=

одинаковые

!=

не одинаковые



меньще чем



больше чем

-
n s1

переменная s1 не пустая

-
z s1

переменная s1 пустая



Создаем файл
statement
.
sh
:



#!/bin/b
ash

# Объявляем символьную переменную S1

S1="Bash"

# Объявляем символьную переменную
S2

S2="Scripting"

if [ $S1 = $S2 ]; then



echo "
Строки

равны
"

else




echo "
Строки

не

равны
"

fi



Запускаем:

$ ./
statement
.
sh

Строки не равны



Меняем код на:



#!/bi
n/bash

# Объявляем символьную переменную S1

S1="Bash"

# Объявляем символьную переменную
S2

S2="Bash"

if [ $S1 = $S2 ]; then



echo "
Строки

равны
"

else




echo "
Строки

не

равны
"

fi



18


Исполняем:

$ ./
statement
.
sh

Строки равны



9)
Проверка файлов

Для пров
ерки статуса файлов и каталогов используются следующие операторы:



-
b

filename

Блочный файл

-
c

filename

Символьный файл

-
d

directoryname

Проверить каталог на существование

-
e

filename

Проверить файл на существование

-
f

filename

Проверить что файл существует и он не директория

-
G

filename

Проверить что файл существует и принадлежит действующей группе.

-
L

filename

Проверить является ли файл символической ссылкой

-
O

filename

Проверить что файл существует и принадлежит пользователю.

-
r

filename

Проверить есть ли права на чтение из файла

-
S

filena
me

Проверить является ли файл сокетом

-
s

filename

Проверить что файл не пустой

-
w

filename

Проверить есть ли права на запись в файл

-
x

filename

Проверить е
сть ли права на исполнение файла


Создаем файл скрипта
file
.
sh

и заносим в него код:



#!/bin/bash

file="./file"

if [
-
e $file ]; then



echo "
Файл

существует
"

else




echo "
Файл

не

существует
"

fi



Выводим список файлов в текущем каталоге (файла
file

нет):

$
ls

file
.
sh



Запускаем скрипт:

$ ./
file
.
sh

Файл не существует



Создаем файл
file

и проверяем его наличие:

$ touch file

$ ls

file

file.sh



Запускаем скрипт:

$ ./file.sh

Файл существует



Аналогично для примера мы можем использовать "в то время к
ак" петли, чтобы
проверить, если файл не существует. Этот сценарий будет в бесконечном цикле, пока файл
не существует. Обратите внимание на то, что в Bash оператор отрицания "!" работает и с
-
e
19


опцией.





10)
Циклы

10.1)
Цикл
For



Пример цикла на
bash
:

#
!/bin/bash

# for
цикл

for f in $( ls /var/ ); do



echo $f

done



Запустим скрипт прямо из командной строки без создания файла:

$ for f in $( ls /var/ ); do echo $f; done

backups

cache

crash

games

lib

local

lock

log

mail

opt

run

spool

tmp

www



10.2)
Whi
le
цикл

Создаем

файл

while_loop.sh:



#!/bin/bash

COUNT=6

# while
цикл

while [ $COUNT
-
gt 0 ]; do



echo
Значение

COUNT: $COUNT



-
1

done



Запускаем

скрипт
:

$ ./while_loop.sh

Значение

COUNT: 6

Значение
COUNT
: 5

Значение
COUNT
: 4

Значени
е
COUNT
: 3

Значение
COUNT
: 2

Значение
COUNT
: 1

10.3)
И последний из циклов
-

Until

цикл

Создаем файл
until
_
loop
.
sh
:

20




#!/bin/bash

COUNT=0

# until
цикл

until [ $COUNT
-
gt 5 ]; do



echo
Значение

COUNT: $COUNT




done



Запуска
ем
:

$ ./until_loop.sh

Значение

COUNT: 0

Значение

COUNT: 1

Значение
COUNT
: 2

Значение
COUNT
: 3

Значение
COUNT
: 4

Значение
COUNT
: 5



Последние два оператора


операторы выбора:

11)
Оператор выбора


Select

Содержимое файла
-
скрипта
select
.
sh
:



#!/bin/bash

P
S3=Выберите одно слово: '


# select

select word in "linux" "bash" "scripting" "tutorial"


do



echo "Было выбрано слово: $word"

# Прерываем, в противном случае цикл будет бесконечный.



break

done

exit

0



Выполнение
:

$ ./
select
.
sh

1) linux

2) bash

3) sc
ripting

4) tutorial

Выберите

одно

слово
: 4

Было выбрано слово:
tutorial



12)
Оператор выбора
-

Case

Содержимое файла
-
скрипта
case
.
sh
:



#!/bin/bash

echo "Какой ваш любимый язык программирования"

echo "1) bash"

echo "2) perl"

echo "3) phyton"

echo "4) c++"

21


echo "5) Я не знаю!"

read case;

# простая структура case
-
выбора

# обратите внимание, что в данном примере $case
-

всего лишь переменная

# и не обязана так называться. Это лишь пример

case

$
case

in



1)
echo

"Вы выбрали
bash
";;


2
)
echo

"Вы выбрали
pe
rl
";;



3)
echo

" Вы выбрали
phyton
";;



4)
echo

" Вы выбрали
c
++";;



5)
exit

esac



Запускаем на исполнение:

$ ./
case
.
sh

Какой ваш любимый язык программирования

1)
bash

2)
perl

3)
phyton

4)
c
++

5) Я не знаю!

4

Вы выбрали c++



Приложенные файлы

  • pdf 1198187
    Размер файла: 594 kB Загрузок: 0

Добавить комментарий