Shell

Что такое shell

Shell — командный интерпретатор, обозначается sh. Первая реализация — 1979 год. Основные стандарты: SYSTEM_V (американский) и POSIX.1 (европейский).

Реализации shell

Название Автор / описание
shКлассический shell
bashBourne Again Shell (Stephen Bourne, Bell Labs)
cshC-shell
kshKorn shell (David Korn) — объединяет csh и bash
zshZ-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
← Назад к списку тем