Shell
Что такое shell
Shell — командный интерпретатор, обозначается sh. Первая реализация — 1979 год. Основные стандарты: SYSTEM_V (американский) и POSIX.1 (европейский).
Реализации shell
| Название |
Автор / описание |
| sh | Классический shell |
| bash | Bourne Again Shell (Stephen Bourne, Bell Labs) |
| csh | C-shell |
| ksh | Korn shell (David Korn) — объединяет csh и bash |
| zsh | Z-shell |
Функции shell
- Интерпретация команд
- Создание среды пользователя
- Обработка имён файлов через метасимволы
- Переадресация ввода/вывода
- Поддержка командного языка (скрипты)
Метасимволы
| Символ |
Значение |
* | Любое количество любых символов |
? | Один любой символ |
[...] | Один символ из указанного набора |
Переадресация ввода/вывода
| Оператор |
Действие |
> | Жёсткая переадресация — перезаписывает файл |
>> | Мягкая переадресация — дописывает в конец файла |
< | Ввод из файла |
| | Конвейер — вывод одной команды на вход другой |
Переменные
Переменная создаётся присваиванием или командой read. Переменная — цепочка символов. Знак $ — взять значение переменной.
a=10
b=sasha
read c d f
echo "a=$a b=$b c=$c"
Специальные переменные
| Переменная |
Значение |
$1, $2, ... | Аргументы командной строки |
$$ | Количество всех shell-переменных в среде |
$? | Возвращаемое значение последней команды (0 — истина, 1 — ложь) |
a=`ls` # присвоить вывод команды ls переменной a
echo $a # вывести список файлов
Права доступа
chmod 700 lab # числовая запись
chmod u+x lab # символьная запись
Встроенные команды shell
| Команда |
Описание |
readonly | Сделать переменную доступной только для чтения |
shift | Сдвинуть аргументы командной строки влево |
test | Вычислить условное выражение |
trap | Перехватить сигнал и выполнить заданное действие |
umask | Показать или установить маску прав доступа |
unset | Удалить переменную или функцию |
wait | Ожидать завершения дочернего процесса |
Арифметика через expr
a=2
a=`expr $a + 7`
b=`expr $a / 3`
c=`expr $a \* $b` # * нужно экранировать
echo "a=$a, b=$b, c=$c"
Проверка файлов командой test
test -e file # файл существует
test -f file # обычный файл
test -d file # каталог
test -r file # доступен для чтения
test -w file # доступен для записи
test -x file # доступен для выполнения
test -s file # не пустой
Пример скрипта — определение типа файла
#!/bin/sh
i=0
handl() {
i=`expr $i + 1`
if test $i -eq 3; then
file * | grep "C source" | cut -d : -f 1
fi
}
trap handl 2 # перехватываем SIGINT
while true; do
echo "Введите имя файла:"
read name
if test -e "$name"; then
b=`ls -lda "$name" | cut -c 1`
case $b in
-) echo "$name - обычный файл";;
d) echo "$name - каталог";;
l) echo "$name - символьная ссылка";;
p) echo "$name - канал FIFO";;
c) echo "$name - символьное устройство";;
b) echo "$name - блочное устройство";;
s) echo "$name - сокет";;
esac
break
fi
done