- •Введение
- •Лабораторная работа 1.
- •Регистрация пользователя в системе
- •Выход из системы
- •Выполнение простых команд
- •Группирование команд
- •Задание для самостоятельной работы
- •Контрольные вопросы
- •Задание для самостоятельной работы
- •Контрольные вопросы
- •Задание для самостоятельной работы
- •Контрольные вопросы
- •Задание для самостоятельной работы
- •Контрольные вопросы
- •Литература
- •5.3. Задание для самостоятельной работы
- •5.4. Контрольные вопросы
- •Задание для самостоятельной работы
- •Контрольные вопросы
- •Задание для самостоятельной работы
- •Формат файла /etc/passwd
- •Формат файла /etc/shadow
- •Формат файла /etc/group
- •Создание нового пользователя
- •Переключение между пользователями
- •Файлы инициализации пользователей
- •Файлы, регламентирующие работу пользователей
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •9.3. Права доступа к каталогам
- •9.4. Смена прав доступа на файлы
- •9.5. Маска на вновь создаваемые файлы
- •9.6. Дополнительные атрибуты файла
- •9.7. Списки управления доступом
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •10.3. Метасимволы или шаблоны
- •10.4. История команд
- •10.5. Псевдонимы
- •10.6. Перенаправление ввода и вывода
- •10.7. Конвейеры
- •10.8. Приглашение ко вводу
- •10.9. Сценарии оболочки
- •10.10. Задания для самостоятельной работы
- •10.11. Контрольные вопросы
- •11.3. Системный вызов open()
- •11.4. Системный вызов read()
- •11.5. Системный вызов write()
- •11.6. Системный вызов lseek()
- •11.7. Системный вызов close()
- •11.8. Задания для самостоятельной работы
- •11.9. Контрольные вопросы
- •12.3. Системный вызов fork
- •12.4. Системный вызов exit
- •12.5. Системный вызов wait
- •12.6. Системный вызов exec
- •12.7. Системные вызовы наследования пользовательских дескрипторов файла
- •12.8. Задания для самостоятельной работы
- •12.9. Контрольные вопросы
- •13.3. Системный вызов signal
- •13.4. Системный вызов pause
- •13.5. Системный вызов alarm
- •13.6. Управление непредусмотренными событиями
- •13.7. Неименованные каналы
- •13.8. Именованные каналы
- •13.9. Задания для самостоятельной работы
- •13.10. Контрольные вопросы
- •Литература
- •Заключение
- •Учебное издание
- •Системное программирование Лабораторный практикум
10.8. Приглашение ко вводу
В оболочке bash различают подсказки двух уровней:
Приглашение системы, ожидающей ввода команды. Оно является приглашением по умолчанию и обозначается символом “$”. Если Вы зарегистрировались с именем root, подсказкой будет символ “#”. Изменить подсказку первого уровня можно через переменную среды PS1. PS1=”подсказка по вводу команды”.
Приглашение системы, ожидающей завершения команды. По умолчанию обозначается символом “>”. Для ее изменения используется переменная среды PS2. PS2=”подсказка к завершению команды”.
Подсказки могут также содержать и специальные символы, которые указаны в таблице 10.1.
Таблица 10.1
Специальные символы
Символ |
Описание |
\! |
Отображает номер команды с учетом истории команд |
\\ |
Отображает обратный слэш |
\d |
Отображает текущую дату |
\t |
Отображает текущее время |
\u |
Отображает имя текущего пользователя |
\w |
Отображает текущий рабочий каталог |
10.9. Сценарии оболочки
Создание скриптов. Сценарий создается в обычном текстовом редакторе с последующим исполнением из командной строки, либо в среде GUI. При этом имя файла с соответствующим скриптом передается оболочке в качестве параметра. Для того, чтобы скрипт мог быть выполнен, необходимо сначала сделать файл исполняемым.
Это делается с помощью команды: $ chmod +х имя_файла. Запуск скрипта в режиме командной строки: $ sh имя_файла.
Переменные. В оболочке, как и в любой другой среде программирования, большую роль играют переменные. Выделяют переменные двух типов:
Встроенные переменные оболочки, которые определяются используемой средой.
Пользовательские переменные, которые создаются и используются пользователем в скриптах оболочки.
Задать переменной новое значение: $ имя_переменной=значение. В языке оболочки shell не требуется предварительного объявления переменных при присваивании им значений. Это означает также и то, что одна и та же переменная может использоваться для хранения значений различного типа, в частности символьных и числовых, например, X=apple или X=4. Чтобы получить значение переменной, необходимо перед именем переменной поставить знак $: $ echo $имя_переменной. Эта команда выведет содержимое переменной на экран.
Пример. $ myname=Julia
$ echo $myname
Julia
Позиционные параметры. В shell имеется особый вид переменных, называемых позиционными параметрами, для которых существенна очередность их следования. Эти переменные используются для ссылки на значения (параметры), передаваемые в командный файл через командную строку. Таких переменных десять и они нумеруются от 0 до 9. При исполнении скрипта, использующего параметры командной строки, каждая из них помещается в соответствующую стандартную переменную, имеющую номер, соответствующий номеру параметра. Первый параметр записывается в переменную 1, второй – в переменную 2 и т.д. Имена переменных зарезервированы оболочкой и не могут использоваться в качестве имен для пользовательских переменных. При обращении к позиционным параметрам перед номером переменной ставится знак доллара “$”.
Пример. $ sh testflor sharon ryan robert
$0 $1 $2 $3 $4
Назначения некоторых из встроенных переменных приведены в таблице 10.2.
Таблица 10.2
Встроенные переменные
Переменная |
Описание |
$# |
Хранит количество аргументов командной строки, передаваемых в программу shell |
$? |
Хранит выходное значение последней выполненной команды |
$0 |
Хранит имя сценария shell – первое слово командной строки |
$* |
Хранит все аргументы командной строки через пробелы |
$@ |
Хранит все аргументы командной строки по отдельности, в качестве разделителя используются кавычки |
Кавычки. В среде программирования shell кавычки играют значительную роль. Различают несколько видов кавычек.
Двойные кавычки. Двойные кавычки “ используются в командном языке shell для экранирования пробелов, присутствующих в присваиваемом значении. Все остальные символы интерпретируются shell как обычно.
Пример. $ myname=”Julia Robots”. В переменную myname будет сохранено значение Julia Robots.
Прямые апострофы. Прямые апострофы применяются для экранирования от shell специальных символов.
Пример. $ echo ‘$myname’
$myname’
Обратный слеш. Обратный слеш также используется при работе со спецсимволами, однако, в отличие от апострофов, скрывающих группу символов, действуют лишь на один символ, стоящий непосредственно за ним.
Пример. $ rate = \$5
$ echo $rate
$5
Обратные апострофы. Обратные апострофы применяются в случае, когда внутри одной команды используется результат выполнения другой, то есть подстановка результатов команд, заключенных в обратные апострофы в соответствующую точку команды.
Условный оператор if. Данный оператор используется для организации ветвлений в скриптах shell, когда в зависимости от заданных условий и значений переменных выбирается, то или иное действие. Структура оператора следующая:
if [выражение] then
список команд
elif [выражение1]
then
список команд
else
список команд
fi
Ветви elif и else являются необязательными в операторе if. Ветка elif выполняется в том случае, если все выражения, заданные в ветке if и во всех ветках elif, находящихся выше, являются ложными. В случае, если ни одно из выражений веток if и elif не является истинным, выполняются команды ветки else.
Пример.
if [-f $1]
then
echo “объект $1 является файлом”
elif
[-d $1]
then
echo “объект $1 является каталогом”
else
echo “ $1 не является ни файлом, ни каталогом”
fi
Оператор выбора case. Используется для сравнения шаблона с некоторыми другими шаблонами, в случае совпадения с одним из них исполняется определенный блок кода. При анализе строк в качестве шаблонов сравнения могут использоваться метасимволы. Структура оператора следующая:
case string in
str1)
команды;;
str2)
команды;;
*)
команды;;
esac
Строка string сравнивается с шаблонами str1 и str2. В случае совпадения с одним из этих значений, выполняется соответствующий ему блок кода. Если ни одно из заданных значений str1 и str2 не является аналогом строки string, выполняются команды, указанные после звездочки.
Пример.
echo “Меню: ”
echo “1. Завтрак”
echo “2. Обед”
echo “3. Ужин”
echo “Сделайте свой выбор”
read choice
case $choice in
1) echo “На завтрак – кукурузные хлопья с молоком”;;
2) echo “На обед – жареный рис с овощами”;;
3) echo “На ужин – шпинат, запеченный с сыром”;;
*) echo “Пожалуйста, введите значения от 1 до 3”;;
esac
Операторы циклов. Язык shell позволяет выполнять повторяющиеся циклические действия. Наиболее распространенным является цикл for. Данный цикл исполняет заданный внутри него фрагмент кода определенное число раз:
for var in список
do
команды
done
При подобной записи цикла, он выполняется для каждого элемента, указанного в списке. Списком может быть переменная, содержащая слова, разделенные пробелами, либо сами значения, указанные непосредственно в конструкции цикла. На каждой итерации цикла переменной var присваивается очередное значение из списка, до тех пор, пока список не будет исчерпан.
Пример.
for num in 1 2 3 4 5 6
do
echo “Число - $num”
done
Другая форма записи цикла for имеет вид:
for var
do
команды
done
В этом случае цикл выполняется по одному разу для каждого элемента переменной var. При этом предполагается, что var содержит все позиционные параметры, переданные в программу shell в командной строке.
Пример сценария. Напишем сценарий, который будет выводить количество исполняемых файлов в каталоге. Создадим файл cntexec и запишем в него следующий текст:
clear
tot=0
for temp in *
do
if [ -x $temp]
then
tot=’expr $tot + 1’
fi
done
echo Исполняемых файлов $tot
Работа сценария представлена ниже.
$ sh cntexex
Исполняемых файлов 13